仲良くして欲しい。
私の中には次のものがあります.zshrc
。
# 1. invoke zoxide to pick dir
# 2. open target dir in ranger
# 3. when exiting ranger, cd into last dir
zoxide_to_ranger () {
eval 'ranger "$(zoxide query -i)" --choosedir=$HOME/.rangerdir < $TTY'
LASTDIR=$(< ~/.rangerdir)
cd "$LASTDIR" || exit
# ensure `precmds` are run after `cd`
local precmd
for precmd in $precmd_functions; do
$precmd
done
zle reset-prompt
}
zle -N zoxide_to_ranger
bindkey '^f' zoxide_to_ranger
Ctrl-f
インラインコメントで提案されているように、これはトリガー時にfzfメニューを表示し、選択時にそのディレクトリでレンジャーを開く便利なツールです。
問題は、を押して選択を解除しようとすると、Esc
まだRangerを開き、私が望むものではないホームディレクトリを私に送信することです。
私の質問は、バインドキーを実行した後にzle機能をキャンセルする方法です。
構成:
zsh 5.9(x86_64-pc-linux-gnu)
オペレーティングシステム: Manjaro Linux
どんなアドバイスも本当にありがとうございます。ありがとう:)
答え1
ラインeval
はさまざまなことをしています。たぶん、あまりにも多くのことが起こっているかもしれません。 1つの方法は、呼び出しを分離して何かをzoxide
返すかどうかを確認することです。別の要件は、~/.rangerdir
ディレクトリ(または何か)があることを確認し、使用後にファイルを空にすることです。これらの新しいチェックは、関数をクリーンアップして終了する必要があるいくつかのポイントを作成します。
function zoxide_to_ranger {
local zz; zz=$(zoxide query -i)
[[ -z $zz ]] && { zle reset-prompt; return }
# not sure if the 'eval' is necessary; does ranger ever exit with
# shell commands to be run?
ranger $zz --choosedir=~/.rangerdir < $TTY
local dd; dd=$(< ~/.rangerdir)
[[ -z $dd ]] && { zle reset-prompt; return }
:> ~/.rangerdir
# this could be "local" unless you use it elsewhere
LASTDIR=$dd
cd $LASTDIR || { zle reset-prompt; return }
local precmd; for precmd in $precmd_functions; $precmd
zle reset-prompt
}