![如何在 zsh 中使用 `Alt + .` 与 Vim 绑定](https://linux22.com/image/200529/%E5%A6%82%E4%BD%95%E5%9C%A8%20zsh%20%E4%B8%AD%E4%BD%BF%E7%94%A8%20%60Alt%20%2B%20.%60%20%E4%B8%8E%20Vim%20%E7%BB%91%E5%AE%9A.png)
我正在使用 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 的另一个答案出现的时候。请注意,只有基本的答案才能将光标保持在正确的位置。是的,它插入到光标之前,似乎没有办法解决这个问题。