测绘<;电子稳定控制系统>;在vimrc中,会导致奇怪的箭头行为

测绘<;电子稳定控制系统>;在vimrc中,会导致奇怪的箭头行为,vim,Vim,我是一个快乐的VIM用户,尽管我承认我还远远不能说流利。我发现了这篇不错的帖子: 我想,如果我不必在每次搜索时都敲掉一个随机的字符序列,我会成为一个更好的人。现在,我还在这里使用vimrc配置: 我遇到的问题是,当我在命令模式下使用箭头时,当我将行nnoremap:noh添加到它时,我会出现尴尬的行为,即从a到D的字母出现在新行中,我切换到插入模式 必须要有一些映射冲突,但就我的一生而言,我不知道它在哪里 编辑:根据答案,最终的vimrc部分是不相关的,提到的nnoremap命令将导致箭头行为

我是一个快乐的VIM用户,尽管我承认我还远远不能说流利。我发现了这篇不错的帖子: 我想,如果我不必在每次搜索时都敲掉一个随机的字符序列,我会成为一个更好的人。现在,我还在这里使用vimrc配置:

我遇到的问题是,当我在命令模式下使用箭头时,当我将行
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>[