在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>
。