如何在触发bindkey后取消zle功能?

如何在触发bindkey后取消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 菜单,并且在选择后它会在该目录中打开 ranger。

问题是,当我想通过按取消选择时Esc,它仍然会打开 Ranger 并向我发送主目录,这不是我想要的。

所以我的问题是,触发bindkey后如何取消这样的zle功能?

配置:

zsh 5.9 (x86_64-pc-linux-gnu)

操作系统:Manjaro Linux

任何意见都非常感谢。谢谢你:)

答案1

eval生产线正在做几件事。也许事情太多了。一种方法是将调用分开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
}

相关内容