バインディングキーを実行した後にzle機能をキャンセルする方法は?

バインディングキーを実行した後にzle機能をキャンセルする方法は?

仲良くして欲しい。

私の中には次のものがあります.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
}

関連情報