为什么 Vim 在与 Ctrl+v 一起使用时会吃掉 Ctrl 以及如何修复它?

phu*_*ehe 3 vim terminal readline

我正在使用 Vim/etc/zsh/zshrc添加键绑定,zsh因为它不适用于inputrc. 在我带有 tmux 的终端中,当我输入Ctrl+v然后Ctrl+LeftArrow外壳将显示^[OD. 但是,当我处于 Vim 插入模式时,按相同的顺序将导致^[[D.

我发现^[[D当我输入Ctrl+ vthen时,shell 会产生这样的结果LeftArrow。我也在文件中更改^[[D为并且它按预期工作(按+会使光标向后移动一个字)。这是我正在谈论的线路:^[OD/etc/zsh/zshrcCtrlLeftArrow

bindkey "^[OD" backward-word
Run Code Online (Sandbox Code Playgroud)

我猜 Vim 有问题,因为它消耗了Ctrl. 我该如何解决?

Gil*_*il' 8

这实际上是你的终端在做一些奇怪的事情,而不是 Vim。由于历史原因,终端有两组与光标键相关的控制序列:一组用于全屏应用程序,通常称为“应用程序光标键模式”,另一组用于读取-评估-打印应用程序(例如 shell)。

在过去,read-eval-print 应用程序没有任何行编辑功能,其目的是使终端或操作系统终端驱动程序最终变得更加复杂。所以终端发送了用于终端驱动程序的控制序列。不知何故,Unix 终端驱动程序从未获得过像样的行编辑功能;这些被添加到应用程序中(例如通过 readline 库)。

的终端发送?OD用于Ctrl+Left在行编辑光标键模式,并且?[D在应用光标键模式。您有两个选择:

  • 配置您的终端不要在两种模式之间产生差异。如何做到这一点完全取决于您的终端模拟器。
  • 和它一起生活。由于任何给定的应用程序始终将终端设置为相同的模式,因此只需根据其使用的模式配置其键绑定即可。

  • 很好的解释。我只是添加一些动手示例:`cat` 并按箭头键 vs `tput smkx; 猫; tput rmkx` 并按箭头键。 (2认同)