希望你做得很好。
我的 中有以下内容.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
}