“内联”zsh 函数

“内联”zsh 函数

在我的 .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_histshell 时,一切正常。但是,当我这样做时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

相关内容