zsh快捷键"ctrl + A"无法使用

35

我最近从bash切换到zsh shell。更准确地说,是oh-my-zsh。 非常好用,但是我经常使用的快捷键——跳转到行首/行尾不再起作用了。根据文档,应该是

ctrl + A --> beginning
ctrl + E --> end

然而,当我这样做时,我得到了以下结果

$~> my-command
$~> my-command^A   # did a ctrl + A here

虽然我看到别人都可以正常运行,但在我的系统上似乎有所不同。你有什么建议吗?


3
请检查 bindkey | fgrep '^A' 是否返回类似于 ""^A" beginning-of-line" 的行。 - chepner
如果我这样做,对于Ctrl+A,我会得到:"^A"-"^C" self-insert,而对于Ctrl+E,我会得到:"^E"-"^F" self-insert。 - Jeanluca Scaljeri
3个回答

48
如果你想知道为什么会发生这种情况:很可能是因为你设置了$EDITOR或者$VISUAL为vi/vim,导致zsh默认使用vi键位而不是用ctrl+a移动光标。
bindkey -e添加到~/.zshrc中将恢复旧的行为(emacs键位)。

1
这就是我的情况了。事实上,我甚至没有将 $VISUAL 设置为 vi,而是设置为一个打开 IDE 的命令,并且路径恰好包含“visual”这个词。 ‍♂️ - Josh
1
谢谢!这篇文章帮助我解决了VSCode/zsh嵌入式终端不识别 ^A/^E 的问题。我找到了其他提示来让这些键在iTerm2上正常工作,但那涉及改变iTerm2的行为而不是修复根本问题。 - mbafford

34

如果您使用默认的键位映射(emacs键位映射),则无需配置 Ctrl+A 的行为。它会按您的预期执行。

然而,如果您将zle设置为使用 vi 键位映射,则必须为 vi-beginning-of-line 定义 keybind。对于 Ctrl+E 也是一样。

因此,请检查您在配置中设置了哪种键位映射。如果是vi,请尝试按下 ESC 然后 ^$ 就可以实现您想要的功能。


1
有什么建议如何检查这个? - Jeanluca Scaljeri
4
你不知道自己使用的按键映射?bindkey -v 映射为vi,bindkey -e 映射为emacs。 - Kent
1
什么是定义此系统范围(Mac)的首选方式?如果更容易,也可以为特定用户定义。现在,如果我打开一个新终端,我必须再次执行此绑定。 - Jeanluca Scaljeri
1
请在您的 ~/.zshrc 文件中写入此内容:@JeanlucaScaljeri - Kent
1
很可能你有Bindkey -v,你可以找到并删除它。或者你在配置文件的结尾加上-e。 - Kent
显示剩余2条评论

16

zsh .zshrc

bindkey "^A" vi-beginning-of-line

7
如果您想保留vim键位映射,那么这是正确的解决方案。使用 bindkey "^E" vi-end-of-line 将ctrl + E映射到行末行为。 - mareoraft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接