测绘<;电子稳定控制系统>;在vimrc中,会导致奇怪的箭头行为
我是一个快乐的VIM用户,尽管我承认我还远远不能说流利。我发现了这篇不错的帖子: 我想,如果我不必在每次搜索时都敲掉一个随机的字符序列,我会成为一个更好的人。现在,我还在这里使用vimrc配置: 我遇到的问题是,当我在命令模式下使用箭头时,当我将行测绘<;电子稳定控制系统>;在vimrc中,会导致奇怪的箭头行为,vim,Vim,我是一个快乐的VIM用户,尽管我承认我还远远不能说流利。我发现了这篇不错的帖子: 我想,如果我不必在每次搜索时都敲掉一个随机的字符序列,我会成为一个更好的人。现在,我还在这里使用vimrc配置: 我遇到的问题是,当我在命令模式下使用箭头时,当我将行nnoremap:noh添加到它时,我会出现尴尬的行为,即从a到D的字母出现在新行中,我切换到插入模式 必须要有一些映射冲突,但就我的一生而言,我不知道它在哪里 编辑:根据答案,最终的vimrc部分是不相关的,提到的nnoremap命令将导致箭头行为
nnoremap:noh
添加到它时,我会出现尴尬的行为,即从a到D的字母出现在新行中,我切换到插入模式
必须要有一些映射冲突,但就我的一生而言,我不知道它在哪里
编辑:根据答案,最终的vimrc部分是不相关的,提到的nnoremap
命令将导致箭头行为改变,即使它是唯一的vimrc条目。将标题更改为信息量更大的标题
另外,我知道我不应该使用箭头,希望有一天我能到达那里。我在这方面运气不错
if $TERM =~ 'xterm'
set noek
endif
nnoremap <silent> <esc> <esc>:noh<cr>
问题是,当您按下箭头时,终端会发出类似于
OA
的信号。支持终端的Vim部件似乎使用了与您使用的相同的映射机制来完成这项工作:虽然nmap OA
不会告诉您任何事情,call feedkeys(“\eOA”)
将向上移动一行,call feedkeys(“\eOA”,“n”)
将在当前行之外添加字母A。由于映射无法实现,您禁止vim将
用作密钥的一部分。问题是这里需要可重映射,但是只有当它以{lhs}
开头时,才可以在不递归的情况下使用可重映射,但是:nohOA
不起作用。我认为下面的代码将(它使用
并具有副作用,使
成为实际{rhs}
的第一个字符,并且仍然启动:noh
),但事实上它没有:
function s:NoHlSearch()
nohlsearch
return "\e"
endfunction
nmap <expr> <Esc> <SID>NoHlSearch()
函数s:NoHlSearch()
诺尔研究
返回“\e”
端功能
nmap NoHlSearch()
。我不知道如何解决包含{lhs}
但不是一开始就包含的非递归可重映射问题
nnoremap <esc> :noh<return><esc>
nnoremap:noh
将与所谓的“灰色键”冲突,我认为它应该仅在GVim中使用,或者由不使用箭头等特殊键的人在终端Vim中使用
据我所知(并猜测),Vim是如何处理键的,我想说这是不可能的。为了使Vim能够识别特殊键,其所有部件应排成一行,因此当您按下向左箭头时,Vim将获得以下代码序列:
[D]
但在映射箭头变为左后:
:无
[D]
Vim看到两个独立的序列,并将其视为一次按Escape键,因此左箭头键的下两个代码失去其特殊意义
因此,我建议您将
:noh
映射到其他一些键序列(例如,映射到以
开头的键序列,请参见:help mapleader
;我不建议您使用F键,使用它们与使用箭头键一样糟糕)。此解决方案保留了到:nohlsearch
的ESC映射
上的注释告诉我们根本原因是vim的TermResponse行为。这可以通过将映射包装在TermResponse事件的自动命令中来补偿
这可确保在设置术语响应后才发生绑定,这可防止Esc向vim发送类似]>1;3201;0c的字符串
将vimrc中的行更改为:
augroup no_highlight
autocmd TermResponse * nnoremap <esc> :noh<return><esc>
augroup END
augroup无突出显示
autocmd TermResponse*nnoremap:noh
螺旋端
augroup命令不是严格必需的,但是当您在不退出vim的情况下重新加载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
if有('gui\u running')
nnoremap:nohlsearch
其他的
“上面的代码
A组无突出显示
autocmd TermResponse*nnoremap:noh
螺旋端
结束
原因解释得很好,但没有提到解决方案。但是有一个直接的原因
如果您明确告诉Vim有从[
:nnoremap:noh
:nnoremap[[
当按下单个
时,Vim将等待一秒钟(或不同的时间,请参阅:h'timeoutlen'
)或下一个键(例如,第二个
)然后用:noh
替换它。我看到了你在使用数字键盘时所描述的内容,但从来没有看到箭头光标键。如果你真的想停止使用箭头键,只需重新映射它们,使其不做任何事()。我做了,但这种方法对我来说仍然有点过于激进:)不幸的是,它对我也有同样的作用:(在没有if语句的情况下尝试一下。所以只需设置noek
和nnoremap:noh
对不起。这对我和我的终端都有效。我猜你发送了不同的键码。你知道你的$TERM是什么吗?@PeterRincker:根据文档(和我的测试)此选项仅适用于插入模式。您确定它会为您更改任何内容吗?抱歉,这不适用于您。@xaizek:适用于我使用它的机器。如果我在终端中打开vim时取出set noek
,它将以一些初始命令开始。我知道它至少是2c
b/c,我有set showcmd
。很高兴知道它是如何工作的,即使我不得不接受另一种解决方案。
是这方面的常见映射。nnoremap:noh
我一直是map:nohlsearch
的粉丝,但当然这都是我的首选。在
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
:nnoremap <silent><esc> :noh<CR>
:nnoremap <esc>[ <esc>[