将密钥重新映射到<esc>在命令模式下不起作用</esc>

时间:2014-06-24 21:20:46

标签: macos vim remap

我在成功将密钥重新映射到<Esc>时遇到了一些麻烦。我尝试过多个字符,所以我想将1重新映射到<Esc>。在我的.vimrc文件中,我添加了以下行:

noremap! 1 <Esc>

这适用于退出插入模式,但是当我处于命令模式时,执行该命令而不是从中进行转义。例如,在正常模式下,如果我输入:

/searchtext1

不会在不搜索的情况下退回到正常模式,而是显示“searchtext”的搜索结果。对于以:开头的命令也是如此。这有解决方法吗?我使用错误的地图功能吗?

我在终端上使用Vim,虽然在MacVim GUI上测试后,它也有这个问题。

2 个答案:

答案 0 :(得分:2)

根据文档,这是预期的行为。它是vi兼容性的一部分。

如果你看:h i_esc | /*3 Go,你会看到以下段落。

*3 Go from Command-line mode to Normal mode by:
   - Hitting <CR> or <NL>, which causes the entered command to be executed.
   - Deleting the complete line (e.g., with CTRL-U) and giving a final <BS>.
   - Hitting CTRL-C or <Esc>, which quits the command-line without executing
     the command.
   In the last case <Esc> may be the character defined with the 'wildchar'
   option, in which case it will start command-line completion.  You can
   ignore that and type <Esc> again.  {Vi: when hitting <Esc> the command-line
   is executed.  This is unexpected for most people; therefore it was changed
   in Vim.  But when the <Esc> is part of a mapping, the command-line is
   executed.  If you want the Vi behaviour also when typing <Esc>, use ":cmap
   ^V<Esc> ^V^M"}

{Vi: ... }开头的部分正在讨论vi兼容性并解释您所看到的行为。

映射:noremap! 1 <c-u><bs>可以满足您的需求。这是完全删除当前行。这是列表中的子弹2。

答案 1 :(得分:0)

我最喜欢的是在所有模式下将Alt-Space映射到Escape。为了做到这一点,我把它放在我的vimrc中:

noremap <a-space> <esc>
inoremap <a-space> <esc>
cnoremap <a-space> <c-u><bs>

Vim中有6组映射,分解如下:

  • noremap获取普通,视觉,选择和操作员待定模式。
  • inoremap获取插入模式
  • cnoremap获取命令行模式(但使用FDinoff提供的解决方案绕过“vi-compatiblebiliy”问题)