如何为zsh设置Vi编辑模式

50
我希望在打开shell时自动将vi设置为编辑模式(我正在使用oh-my-zsh),因此在我的.zshrc文件的开头,我尝试了以下代码:
set -o vi
或者
bindkey -v
但是当我在shell里按回车键时,不能进入vi模式。
如果我在shell中尝试其中一个命令,它可以正常工作。
基本上,我想让zsh在vi编辑模式下启动。
有什么解决这个问题的想法吗?

你能标记一下对你来说最好的答案吗? - dan
3个回答

60

bindkey -v足以在ZSH中启用vi模式。如果您担心该设置将被另一个插件覆盖,请将设置放在~/.zshrc文件的底部。

启用vi模式后,默认情况下进入“插入”模式。要进入“正常”模式,请使用Esc键。使用ia切换回“插入”模式。

顺便说一句,softmoth/zsh-vim-mode是我在ZSH中使用过的最强大的vim模式插件。

使用bindkey -v可能会接管历史记录搜索等功能,例如使用control+Rcontrol+S。要恢复特定的行为,请在bindkey -v之后添加以下行:

bindkey ^R history-incremental-search-backward 
bindkey ^S history-incremental-search-forward

在 ZSH 手册的 标准小部件 部分可以找到其他的绑定。


7
这似乎会产生不良效应,导致 ctrl + R 失去绑定。 - progfan
@progfan 的确如此。这个对我很有帮助:https://vimawesome.com/plugin/zsh-history-substring-search - McHobbes
2
也许我漏掉了什么,但是如果你按esc键进入命令模式,你就可以像在vi中一样进行搜索。 - anahata

37
如果您正在使用 https://ohmyz.sh/,则可以将 vi-mode 添加到 ~/.zshrc 的插件列表中。
plugins=(git vi-mode)

4
并且要添加光标模式指示器,请添加INSERT_MODE_INDICATOR="%F{yellow}+%f",如果要将jj映射为esc,请添加bindkey -M viins 'jj' vi-cmd-mode - Ali Aref
我已经做了这个,它没有报错什么的,但似乎没有任何作用。我还需要做些别的事情来使用/激活它吗? - stevec
@stevec 可以打开一个新的 shell 或终端吗? - olore
@stevec 要么打开一个新的 shell 或终端,要么运行 source <path_to_.zshrc>。默认位置是 ~/.zshrc。 - henry groves
有用的提示:在正常模式下按 vv(而不是 bash vi 模式中的 v)可以在 vim 编辑器中编辑命令行。 - bricoletc

11

如果您不介意在zsh中使用vi模式的插件,那么我写了一个更好的选择,可以让您快速到达它。

zsh-vi-mode:ZSH的更好和友好的vi(vim)模式插件。

添加此插件后,您可以像这样使用vi模式输入:

demo

特点

  • 光标移动(导航)。
  • 插入和替换(插入模式)。
  • 文本对象。
  • 搜索文本。
  • 撤销、重做、剪切、复制、粘贴和删除。
  • 环绕(添加、替换、删除和移动)。
  • 切换关键字(增加/减少数字、布尔值等,正在进行中)。
  • ...

1
我暂时停止使用这个插件。文档有点稀少,比如说..历史搜索中的 / 是怎么工作的?它破坏了我现在习惯的过滤历史记录,我肯定需要至少一个历史搜索功能,例如 '/'。 - robert arles
上述插件的另一个缺点是默认情况下它会接管所有现有的绑定和键映射,这不应该是默认行为。 - gented
对于文档部分,您可以从源代码中寻找线索或创建问题。如果您不接管某些默认的键绑定,您会发现有些问题很难解决,这是一种权衡。 - J.T.
1
为了避免此答案被视为垃圾邮件,需要明确说明您是该项目的开发人员。 - camille

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