在我的 .zshrc 中,我有这个函数定义,它打印出 vim 历史记录并在 vim 中打开所选文件:
vim_hist() {
n=$(sed -n "s|~|$HOME|;s|^> \(.*\)|\1|p" ~/.vim/viminfo | fzf)
[ "$n" != "" ] && [ -f "$n" ] && vim $n
}
这是 .zshrc 中的声明:
zle -N VH vim_hist
bindkey '^a' VH
当我进入vim_hist
shell 时,一切正常。但是,当我这样做时CTRL-A
,我收到警告Vim: Warning: Input is not from terminal
,这使得命令明显变慢。这里有什么问题?
答案1
请参阅文档 ( info zsh widgets
):
用户定义的小部件作为 shell 函数实现,可以执行任何普通的 shell 命令。他们还可以使用 zle 内置命令运行其他小部件(无论是内置的还是用户定义的)。 函数的标准输入从 /dev/null 重定向,以防止外部命令通过从终端读取而无意中阻塞 ZLE,但可以使用 read -k 或 read -q 来读取字符。最后,他们可以通过读取和设置下述特殊参数来检查和编辑正在编辑的 ZLE 缓冲区。
在这里,你可以撤消通过这样做:
vim_hist() {
n=$(sed -n "s|~|$HOME|;s|^> \(.*\)|\1|p" ~/.vim/viminfo | fzf)
if [ "$n" != "" ] && [ -f "$n" ]; then
vim < /dev/tty $n
zle -I
fi
}
(还调用zle -I
使提示无效,以便在返回时重新绘制vim
)