我是一个快乐的VIM用户,虽然我承认我还不够流利.我找到了这篇不错的帖子: Vim清除了最后一次搜索突出显示,如果我不必每次进行搜索时都不需要敲击随机字符序列,我认为我会成为一个更好的人.现在,我也在这里使用vimrc配置:
我遇到的问题是,当我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键,使用它们与使用箭头键一样糟糕).
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>.