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

Tom*_*tal 17 vim

我是一个快乐的VIM用户,虽然我承认我还不够流利.我找到了这篇不错的帖子: Vim清除了最后一次搜索突出显示,如果我不必每次进行搜索时都不需要敲击随机字符序列,我认为我会成为一个更好的人.现在,我也在这里使用vimrc配置:

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

我遇到的问题是,当我nnoremap <esc> :noh<return><esc>向它添加线条时(我似乎没有区别)我在命令模式下使用箭头时会出现尴尬的行为,即从A到D的字母出现在换行,我切换到插入模式.

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

编辑:从答案中可以看出,终极vimrc部分不相关,nnoremap即使它是唯一的vimrc条目,所提到的命令也会导致箭头行为发生变化.将标题更改为更具信息性的标题.

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

xai*_*zek 17

映射

nnoremap <esc> :noh<return><esc>
Run Code Online (Sandbox Code Playgroud)

将与所谓的"灰键"冲突,我相信它应该只在GVim中使用,或者在不使用箭头等特殊键的人的终端Vim中使用.

根据我所知道的(和猜测)Vim如何处理密钥,我会说用这个做任何事都是不可能的.要让Vim识别特殊键,它的所有组件应该连续排列,所以当你按下Arrow LeftVim时会得到以下代码序列:

<esc> [ D

但是在映射Arrow Left成为:

: n o h l <cr> <esc>

[ D

Vim看到两个独立的序列,并将其<esc>视为单键Escape按键,因此接下来的两个Left Arrow密钥代码松散了它们的特殊含义.

因此,我建议您映射:noh到其他一些键序列(例如,以一个开头<leader>,请参阅:help mapleader;我不建议您使用F键,使用它们与使用箭头键一样糟糕).

  • 我一直是`map <silent> <Leader> <Leader>:nohlsearch <cr>`的粉丝,但当然这都是首选. (4认同)
  • `<cl>`是这个的常见映射.`nnoremap <cl> <cl>:noh <cr>` (2认同)

Eri*_* Hu 14

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

对此答案的评论解释了为什么会发生这种情况告诉我们,根本原因是vim的TermResponse行为.这可以通过将映射包装在TermResponse事件的自动命令中来补偿.

这样可以确保设置术语响应之后才会发生绑定,从而防止Esc发送类似于]>1;3201;0cvim 的字符串.

将vimrc中的行更改为:

augroup no_highlight
    autocmd TermResponse * nnoremap <esc> :noh<return><esc>
augroup END
Run Code Online (Sandbox Code Playgroud)

augroup命令不是严格必需的,但是当你重新加载vimrc而不退出vim时它们会阻止多次映射.

编辑: 如果您还使用像Gvim或Macvim这样的图形文件,则不会触发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
Run Code Online (Sandbox Code Playgroud)


Dmi*_*rov 10

原因已得到解释,但未提及解决方案.然而,有一个直的.

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

:nnoremap <silent><esc> :noh<CR>
:nnoremap <esc>[ <esc>[
Run Code Online (Sandbox Code Playgroud)

比单个<esc>按下时,Vim会等待一秒钟(或不同的时间,见:h 'timeoutlen')或下一个键(<esc>例如秒),然后再替换它:noh<CR>.

  • `:nnoremap <esc> ^ [<esc> ^ [` (3认同)
  • 半年后...... @ fanuch或其他任何人都想知道同样的事情:是的,这两行肯定会进入你的.vimrc.只是**省略起始冒号**,并确保你没有对映射的权利进行任何评论(上面或下面是一个好主意,提醒你为什么你有他们或他们做什么).半年后,哦,好吧 (3认同)