Shift+Enter 在终端中做什么,我可以在 Vim 中禁用它吗?

dav*_*gan 5 linux ssh terminal cygwin vim

每个人偶尔都会在 Vim 中处于插入模式,我会很高兴地一起打字,但突然间我会被抛出插入模式,并且在按下某个组合键后我的最后一次编辑被撤消。

\n\n

今天我意识到这个神秘的组合\n是Shift+ Enter。果然,无论是否处于插入模式, \n点击Shift+都会运行撤消操作。Enter

\n\n

然后我尝试执行Ctrl+ V\xe2\x80\x82 Shift+来查看+Enter的字面值是什么,它打印出来:ShiftEnter

\n\n
^[[13;2u\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在它有意义了 -^[是逃避,最后u是撤消。按此顺序键入其他字符时不会执行任何操作。

\n\n

它似乎是某种控制代码,但我似乎找不到合适的东西来搜索以了解这意味着什么。

\n\n

有谁知道这个控制代码是什么意思,以及是否可以在 Vim 中禁用它?我假设我的终端可能与它有关 \xe2\x80\x93 我正在使用 Cygwin 的库存终端 ssh 进入 Linux 机器并在其上运行 ssh 。

\n

Hep*_*ite 5

在不深入终端功能和转义码的复杂性的情况下,我将确认您已经发现的内容:终端正在尝试提供一种方法来区分修改后的和未修改的输入键。

编辑:更正,当 Vim 将 Mintty 终端置于“原始”模式时,它会将Shift+Enter视为空字节,并将其显示为^@在其前面加上Control+v,但无论如何将其视为换行符。

有多种方法可以解决这个问题。一种是使用 Cygwin 的 Mintty,它不会发送任何带有Shift+的唯一内容Enter。与库存终端相比,它还具有其他优势。

~/.vimrc然而,一个“快速而肮脏”的解决方案是在远程计算机上添加类似的内容:

:imap <esc>[13;2u <CR>
Run Code Online (Sandbox Code Playgroud)

这样做的缺点是,从那时起,每次您按转义键时,它都不会离开插入模式,直到您开始使用移动命令或地图超时间隔到期。请参阅“ :help 'timeout'”及以下相关条目。

另一种解决方案可能不可行(并且可能无法真正解决问题),但它是为了确保在 ssh 之前在 Cygwin shell 上以及在 ssh 之后在远程 shell 上正确设置 TERM 变量,并且它们匹配,或者它们足够相似。(您永远不应该TERM=<anything>在 shell 配置文件中进行无条件设置。)