在vimrc中映射<esc>会导致奇怪的箭头行为

虽然我承认自己远没有流利,但我是一位快乐的VIM用户。 我发现了这个不错的帖子:Vim清除了最后一次搜索突出显示,如果我每次搜索时都不需要随机选择一个字符序列,那么我认为自己会变得更好。 现在,我也从这里使用vimrc配置:

http://amix.dk/vim/vimrc.html

和我遇到的问题是,当我添加行nnoremap <esc> :noh<return><esc>它(它似乎没有区别,我把它放在)我使用尴尬的行为,当我使用箭头命令模式,即从A到D的字母出现在换行符中,并且我切换到插入模式。

必须有一些映射冲突,但对于我的生活,我无法弄清楚它在哪里。

编辑:从答案中可以看出,最终的vimrc部分是不相关的,即使它是唯一的vimrc条目,提到的nnoremap命令也会导致改变的箭头行为。 将标题改为更丰富的标题。

PS。 我知道我不应该使用箭头,希望有一天我会到达那里。


映射

nnoremap <esc> :noh<return><esc>

将会与所谓的“灰色键”发生冲突,我相信它应该仅用于GVim中,或者用于不使用箭头等特殊键的用户在Vim终端中。

根据我所知(并猜测)Vim如何处理密钥,我会说这是不可能的。 对于Vim来说,识别特殊键的所有组件应该连续排列,所以当你按下左箭头键时Vim得到以下代码序列:

<esc> [D

但是在您的映射箭头左变成后:

:nohl <cr> <esc>

[D

Vim会看到两个单独的序列,并将<esc>当作Escape键的单独按键,因此接下来的两个Left Arrow键代码将失去其特殊含义。

因此,我建议你将:noh映射到其他一些按键序列(例如,以<leader>开头的一个,参见:help mapleader ;我不建议您使用F键,使用它们与使用箭头键一样坏)。


此解决方案将ESC映射保留为:nohlsearch

解释为什么会发生这种情况的评论告诉我们,根源是vim的TermResponse行为。 这可以通过将映射包装在TermResponse事件的自动命令中来弥补。

这可以确保绑定不会发生,直到设置了术语响应 ,这会阻止Esc发送像]>1;3201;0c这样的字符串给vim。

将vimrc中的行更改为:

augroup no_highlight
    autocmd TermResponse * nnoremap <esc> :noh<return><esc>
augroup END

augroup命令并不是绝对必要的,但是当你重新加载vimrc而不退出vim时,它们会阻止多个映射。

编辑:如果你也使用像Gvim或Macvim的图形vim,TermResponse事件不会触发。 假设你使用一个vimrc,你需要一些额外的代码

if has('gui_running')
  nnoremap <silent> <esc> :nohlsearch<return><esc>
else
  " code from above
  augroup no_highlight
    autocmd TermResponse * nnoremap <esc> :noh<return><esc>
  augroup END

end

原因已被解释得很好,但解决方案没有被提及。 但是有一个直线的。

如果你明确地告诉Vim,有从<esc>[开始的关键序列<esc>[

:nnoremap <silent><esc> :noh<CR>
:nnoremap <esc>[ <esc>[

比按下单个<esc>时Vim将等待第二个(或不同的时间,参见:h 'timeoutlen' )或下一个键(例如第二个<esc> ),然后将其替换为:noh<CR>

链接地址: http://www.djcxy.com/p/49375.html

上一篇: Mapping <esc> in vimrc causes bizarre arrow behaviour

下一篇: How to get rid of search highlight in Vim