大家偶尔会在 Vim 中进入插入模式时,开心地打字,突然间,在按下某个组合键后,我就会退出插入模式,并且上次编辑会被撤消。
今天我意识到那个神秘的组合是Shift+ Enter。果然,无论是否处于插入模式,按Shift+都会执行撤消操作。Enter
然后我尝试执行Ctrl+ V Shift+来查看+Enter的字面值是什么,结果打印出来:ShiftEnter
^[[13;2u
现在它有意义了 -^[
是退出,u
最后的是撤消。按此顺序输入时,其他字符不会执行任何操作。
它似乎是某种控制代码,但我似乎找不到正确的东西来搜索这是什么意思。
有谁知道这个控制代码是什么意思,以及是否可以在 Vim 中禁用它?我假设我的终端可能与它有关——我正在使用 Cygwin 的库存终端通过 ssh 进入 Linux 机器并通过它运行 ssh。
答案1
无需了解终端功能和转义代码的复杂性,我将确认您已经发现的内容:终端正在尝试提供一种区分已修改和未修改的回车键的方法。
编辑:更正,看来当 Vim 将 Mintty 终端置于“原始”模式时,它会将Shift+Enter视为空字节并将其显示为^@
在它前面加上Control+一样v,但否则会将其视为换行符。
有多种方法可以解决这个问题。一种方法是改用 Cygwin 的 Mintty,它不会使用Shift+发送任何唯一信息Enter。与普通终端相比,它还有其他优势。
但是,“快速而肮脏”的解决方案是在~/.vimrc
远程机器上添加类似这样的内容:
:imap <esc>[13;2u <CR>
缺点是,从那时起,每次按下 Esc 键,它都不会离开插入模式,直到您开始使用移动命令或地图超时间隔到期。请参阅“ :help 'timeout'
”和以下相关条目。
另一个解决方案可能不可行(并且可能无法真正解决问题),但它可以确保在 ssh 之前在 Cygwin shell 上正确设置了 TERM 变量,并在 ssh 之后在远程 shell 上正确设置了 TERM 变量,并且它们匹配,或者足够相似。(您永远不应该TERM=<anything>
在 shell 配置文件中进行无条件设置。)