Vim:自动高亮选定单词的所有出现次数

5
Notepad++有一个非常好的功能,如果你选择一个单词,所有其他出现的该单词都会自动高亮显示,就像这样(只有我手动高亮显示的第一个autocmd):

N++ highlighting screenshot

我知道已经有类似的问题,但我希望有一种不需要手动交互的解决方案。


1
手动交互是什么意思?您想让vim始终突出显示匹配项吗? - pkacprzak
我同意不清楚原帖作者想要什么。你是用鼠标选择单词吗? - jahroy
抱歉没有表达清楚。所谓“选择”,是指突出显示一个单词。如果光标位于该单词开头,则按下Shift+Ctrl(Mac上为Option)+右箭头。如果对第一个单词这样做,所有其他出现的相同单词会立即以不同的颜色被突出显示。 - Nicolas
4个回答

18

如果你按下*,Vim会搜索光标下单词的所有出现。

如果你已经打开了搜索高亮显示,它们将被突出显示。

您可以通过在.vimrc中添加以下内容来打开搜索高亮显示:

set hlsearch

一个好处是你不再需要选择单词......只需按下*键。

(你可以将其映射到其他键上,使其更加方便)


如果你不喜欢按下*时光标移动的方式,你可以通过简单的映射来防止它:

nnoremap * *N

将其放入您的 .vimrc 文件中

按下*键时,此功能将保持光标在其当前位置。


选择是在可视模式下突出显示单词。当光标位于第一个字母时,v e 将是 Vim 键。与 hlsearch 结合使用很好,只是它会移动光标。有没有可能在不改变光标位置的情况下完成呢? - Nicolas
请查看我的回答的后半部分。它提供了一种禁用光标移动的映射。 - jahroy

3

这样的做法可能是可行的。

(注:已保留HTML标签)
set updatetime=10

autocmd! CursorHold,CursorHoldI * let @/='\<'.expand('<cword>').'\>'

这个功能使用CursorHold事件来设置光标下的单词到/寄存器中。为了让CursorHold事件更频繁地触发,updatetime被降低到10(从4000)。

问题:

  1. 你需要手动执行:set hlsearch。由于某些原因它不会自动开启。
  2. 这会干扰正常的搜索。每当光标移动时,你都会改变/寄存器。

总的来说,我不建议使用这个功能,因为我认为搜索比这个功能更重要。


3
你可以使用:match代替对搜索寄存器的篡改,但方法是相同的。这可能是实现OP想要的最佳方式。 - Randy Morris

2
我的SearchHighlighting plugin插件有一个<Leader>*映射和:SearchAutoHighlighting命令来启用此功能。它可以突出显示光标下的当前单词/WORD/整个单词/行/确切行。

1
我会这样做:

:au CursorHold,CursorHoldI * :try | exe "call matchdelete(w:my_match)" | catch |  finally | let w:my_match = matchadd('IncSearch', expand('<cword>')) | endtry

如果你不喜欢高亮显示,可以从:hi的输出中选择一个漂亮的替代IncSearch。注意:这可能会显著降低Vim的运行速度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接