如何在 zsh 中使用 `Alt + .` 与 Vim 绑定

如何在 zsh 中使用 `Alt + .` 与 Vim 绑定

我正在使用 zsh 和bindkeys -v.

Alt + .不按预期工作。它似乎在下一行重复当前在标准输入中输入但未输入的内容。

这个帖子似乎暗示它确实像在 bash 中那样工作,即获取最后输入的命令的最后一个参数。

需要什么才能使这项工作按预期进行?

答案1

在终端上,Alt+char通常与 相同Esc char。 (可以对某些终端进行不同的配置。)

在 vi 插入模式下,Esc切换到命令模式。在 vi 命令模式下,Esc不执行任何操作。在 vi 命令模式下,.重复上一条命令。

小部件insert-last-word在 emacs 模式下默认绑定到Alt+.Alt+ _,但在 vi 模式下没有默认绑定。如果你想在vi模式下使用它,你需要给它一个绑定,例如

bindkey -M vicmd _ insert-last-word

请注意,这是一个插入命令:它在光标之前插入文本,这不能在行尾完成。对于经常在行尾使用的命令来说,这相当不方便。您可能更喜欢定义append-last-word

function append-last-word { ((++CURSOR)); zle insert-last-word; }
zle -N append-last-word
bindkey -M vicmd _ append-last-word                        

答案2

请看这个答案。https://stackoverflow.com/a/34293570/340947与其他答案相反,它的vicmd映射在我的(非全面)测试中存在严重问题!这个viins映射似乎是窍门。

引述如下(针对~/.zshrc):

bindkey -M viins '\e.' insert-last-word

对于 bash 来说也是如此,在~/.inputrc

set keymap vi-insert
"\e.":yank-last-arg

好的,这涵盖了最常见的用例,即 Alt+。在这些 shell 中处于插入模式,但有时我们在正常模式下导航并希望从之前插入最后一个参数。这就是 @gilles 的另一个答案出现的时候。请注意,只有基本的答案才能将光标保持在正确的位置。是的,它插入到光标之前,似乎没有办法解决这个问题。

相关内容