为了从插入模式切换回我习惯了<Esc>。现在,我希望将自己重新训练为<C-[>而不是<Esc>。为此,我需要禁用<Esc>来帮助进行重新训练。

问题是

:inoremap <Esc> <Nop>


也禁用了<C-[>。对于vim,它们似乎是同一回事。

有没有办法禁用一个而不使用另一个?

评论

这取决于您在什么环境下工作。当您按下Esc或C- [时,大多数文本终端会将相同的信息发送到应用程序,因此您很不走运,但是您可以使用GUI版本的Vim或通过重新配置终端来执行某些操作。 >
对!不是vim问题。我将找到一种解决键盘映射的方法。谢谢

@Gilles为什么不回答呢?对于Google员工和我们的网站统计数据来说更好。

@SuperScript我对此进行了更多研究并发布了答案。

#1 楼

首先,有一点历史。过去,当您在终端上键入一些文本时,每个键都会向应用程序发送一个字符。随着终端所连接的机器变得越来越强大,终端在控制键上进行了标准化,该控制键将发送一些特殊字符,这些特殊字符并未打印但具有某种功能。最终的胜利字符集是ASCII,其中包含128个字符,其中32个是控制字符。按下Ctrl键以及一个字母或其他记为10xxxxx²(二进制符号)的符号,将发送控制字符,其代码为00xxxxx_2,例如Ctrl + [发送字符号27₁₀=0011011²,因为[为91₁₀=1011011²。

终端上的一些功能键发送了控制字符: = Ctrl-H(BS =退格键)¹

制表符= Ctrl-I(HT =水平制表符)

换行= Ctrl-J(LF =换行)(很少有终端使用此键)

返回或输入= Ctrl-M(CR =回车)

转义= Ctrl-[(ESC =转义)

当终端具有更多功能键时,没有足够的控制字符来表示它们。因此他们发送了字符序列,并且通用的惯例是这些字符序列以转义字符Ctrl-[开头。

随着时间的流逝,硬件终端变得越来越稀有;如今,键盘和应用程序之间存在许多转换级别。可用字符数量的限制以及某些按键组合和某些控制字符之间的硬编码对应关系不再相关。但是,应用程序仍与现有终端兼容,并且终端仍与现有应用程序兼容,这使得更改任何内容都很困难。

因此,即使在今天,在类似Unix的系统上,在终端仿真器上运行的应用程序在用户按下Tab键时仍收到字符Ctrl-I,在用户按下Esc时仍收到字符Ctrl-[,等等。因为终端发送相同的信息,所以不能区分<Esc><Ctrl-[>。在其他环境中运行的Vim没有此限制,因此原则上它们可以发送不同的信息。鉴于Vim在很多地方都使用Ctrl-[字符来表示<Esc>,因此更改该值不切实际;取而代之的是Ctrl + [可以发送不同的输入事件。曾经使用过任何)。 Gvim似乎仿效了一个花园综合终端。

具有讽刺意味的是,最好的选择可能是在终端模拟器中运行Vim。一些终端仿真器允许您自定义按键和琴弦发送的转义序列。因此,您可以安排Ctrl + [不发送␛(Ctrl-[)字符,而是发送一些转义序列。 Xterm是类Unix系统的“参考”终端仿真器,支持两种这样的方案。例如:



Esc在所有配置中发送,而Tab发送
对于?.VT100.modifyOtherKeys: 0(默认)或?.VT100.modifyOtherKeys: 1,Ctrl + [发送和Ctrl +我发送?.VT100.modifyOtherKeys: 1仅影响缺少ASCII字符的元组合和控制组合。
使用?.VT100.modifyOtherKeys: 2?.VT100.formatOtherKeys: 0(默认值),Ctrl + [发送␛[27;5;91~,而Ctrl + I发送␛[27;5;105~。 Ctrl + I发送?.VT100.modifyOtherKeys: 2

可以通过在启动xterm时设置?.VT100.formatOtherKeys: 1资源来打开支持(并且可以通过␛[91;5u在两种方案之间进行选择),也可以通过以下方式动态打开和关闭该支持:应用程序。

Vim没有我所知道的内置支持。您可以为这些转义序列编写自己的绑定。通过向Vim提供修改后的终端定义,可以使Vim自动将终端设置为␛[105;5u模式,但这超出了此答案的范围。变体之一。据我了解,如果终端支持,它不会打开支持,这取决于用户。

¹如今越来越普遍,Backspace发送字符127。