如何在VIM中突出显示所选单词的所有出现?

195

我该怎样在GVim中高亮选定单词的所有出现,就像在Notepad++中一样?

16个回答

245

正常模式下:

:set hlsearch

在普通模式下,使用命令/搜索一个模式,或者在插入模式下按<Ctrl>o,然后输入/。在普通模式下,*将查找光标下单词的下一个出现位置。如果设置了hlsearch选项,则会突出显示所有单词的出现位置。#将查找单词的上一个出现位置。

要取消先前搜索的高亮显示:

:nohlsearch

你可能希望将:nohlsearch<CR>映射到一些方便的按键上。


44
如果你打算经常切换 hlsearch,你可能需要将:set nohlsearch映射为:set hlsearch!。这样会切换设置而不是总是关闭它。 - David Winslow
1
另外,请注意光标会移动到单词的前一个(#)或后一个(*)出现位置。 - Juan Campa
1
但是在正常模式下,您可以通过 <Ctrl> o 返回到按下 *# 的位置。 - Ruslan
11
дҪ еҸҜд»ҘдҪҝз”Ё:nohжӣҝд»Ј:nohlsearchпјҢдёӨиҖ…зҡ„дҪңз”ЁзӣёеҗҢгҖӮ - crisron
2
.vimrc中设置:noremap <F4> :set hlsearch! hlsearch?<CR>,用于通过 <F4> 切换高亮和取消高亮。 - Chalist

154

*键将突出显示光标下的单词的所有出现。


38
仅当&hlsearch打开时。 - wilhelmtell
14
它还会跳转到光标下单词的下一个出现位置。如果想跳转至前一个出现位置,请使用“#”。 - Vinicius Braz Pinto
14
我可以让它停留在当前位置吗? - nn0p
1
有没有办法使用此功能,但带有突出显示的一个或多个单词? - mc9
@pankaj 请参考 https://dev59.com/b18e5IYBdhLWcg3wZ5us#25787211。您可以将搜索结果高亮切换映射到某个键上,例如 :nno <F9> :set hls!<CR> - steffen
显示剩余5条评论

24

我知道这是一个非常老的问题,但如果有人对此功能感兴趣,可以查看这段代码http://vim.wikia.com/wiki/Auto_highlight_current_word_when_idle

" Highlight all instances of word under cursor, when idle.
" Useful when studying strange source code.
" Type z/ to toggle highlighting on/off.
nnoremap z/ :if AutoHighlightToggle()<Bar>set hls<Bar>endif<CR>
function! AutoHighlightToggle()
   let @/ = ''
   if exists('#auto_highlight')
     au! auto_highlight
     augroup! auto_highlight
     setl updatetime=4000
     echo 'Highlight current word: off'
     return 0
  else
    augroup auto_highlight
    au!
    au CursorHold * let @/ = '\V\<'.escape(expand('<cword>'), '\').'\>'
    augroup end
    setl updatetime=500
    echo 'Highlight current word: ON'
  return 1
 endif
endfunction

1
能否修改这个脚本,使得在按下z/时初始高亮光标下的文本即使移动到其他单词时仍然保持高亮?这将在浏览源代码查找初始单词时非常有用。 - stensootla

21

最简单的方法,在正常模式下输入*

我还有这些映射来启用和禁用

"highligh search enabled by default
set hlsearch
"now you can toggle it
nnoremap <S-F11> <ESC>:set hls! hls?<cr>
inoremap <S-F11> <C-o>:set hls! hls?<cr>
vnoremap <S-F11> <ESC>:set hls! hls?<cr> <bar> gv

点击单词进行选取

set mouse=a     "Enables mouse click
nnoremap <silent> <2-LeftMouse> :let @/='\V\<'.escape(expand('<cword>'), '\').'\>'<cr>:set hls<cr>

奖励:计数单词函数

fun! CountWordFunction()
    try
        let l:win_view = winsaveview()
        let l:old_query = getreg('/')
        let var = expand("<cword>")
        exec "%s/" . var . "//gn"
    finally
        call winrestview(l:win_view)
        call setreg('/', l:old_query)
    endtry
endfun
" Bellow we set a command "CountWord" and a mapping to count word
" change as you like it
command! -nargs=0 CountWord :call CountWordFunction()
nnoremap <f3> :CountWord<CR>

使用鼠标选择单词并同时计算出现次数:

OBS: 注意,在此版本中,我们在最后有一个"CountWord"命令。

nnoremap <silent> <2-LeftMouse> :let @/='\V\<'.escape(expand('<cword>'), '\').'\>'<cr>:set hls<cr>:CountWord<cr>

现在我使用 nnoremap * *``cgnnnoremap # #``cgN - SergioAraujo
2
那么在我输入 * 后,如何关闭高亮显示? - user5359531
这是用于在文档中突出显示当前单词的功能。 - Chalist
@user5359531::noh:nohlsearch - dylnmc
@user5359531,nnoremap <silent> * :execute "normal! *N"<cr>nnoremap <silent> # :execute "normal! #n"<cr>呢?它们只是突出显示光标下的单词,但不会将其移动到下一个出现位置。 - dylnmc
双击突出显示所有实例是一个福音。我还喜欢将 Ctrl-h 映射到取消高亮显示:noremap <C-h> :noh<cr> - Andy J

11

搜索基于光标移动的解决方案(*, /...)有时可能会不太方便。

另一种选择是使用enhanced mark.vim插件,然后完成你的.vimrc文件以让双击触发高亮(我不知道如何使用键盘选择来触发一个命令):

"Use Mark plugin to highlight selected word  
map <2-leftmouse> \m   

它允许多重高亮,持久性等。

要取消高亮,请执行以下操作之一:

  • 再次双击
  • :Mark(关闭直到下次选择)
  • :MarkClear

2
只有在启用增量搜索时,基于搜索的解决方案才会移动光标。您可以像这样关闭它::set noincsearch。在我看来,这是 Vim 中最烦人的功能之一,也是我在新安装中禁用的第一件事情。 - jahroy
3
我认为*会无条件地移动光标。而且我看不出 incsearch 会有什么烦人之处,因为它只是 "预览" ,在不实际更改位置的情况下执行当前搜索。 - YvesgereY
3
哇...你说得对。我假设关闭incsearch就可以防止移动,但是快速测试证实你是正确的。抱歉。不过,很容易创建一个映射来防止移动::nnoremap * *N。我不敢相信你居然不觉得在执行搜索时光标在屏幕上跳来跳去很烦人。但是这些事情完全是主观的。不同的看法,都应该被尊重。;-) - jahroy
3
如果你启用了hlsearch,你也可以执行:let @/='hilight_this'命令来高亮文本,而不会跳转位置,并且你无需更改现有的设置。这将更改当前存储在搜索寄存器中的值。 - Ben Davis
1
这应该是被接受的答案。<leader>m 完成这项工作,不需要映射双击。 - Sassan
显示剩余2条评论

4

首先(或在您的.vimrc文件中):

:set hlsearch

把光标放在你想要突出显示的单词上,然后按下*

hlsearch表示突出显示当前搜索的所有出现次数,*表示搜索光标下的单词。


4

要在不移动光标的情况下突出显示单词,请使用“plop”。

" highlight reg. ex. in @/ register
set hlsearch
" remap `*`/`#` to search forwards/backwards (resp.)
" w/o moving cursor
nnoremap <silent> * :execute "normal! *N"<cr>
nnoremap <silent> # :execute "normal! #n"<cr>

加入到你的vimrc文件中。

好处在于g*g#仍然像“正常”的*#一样工作。


要关闭hlsearch,可以使用“短格式”(除非您在命令模式下有另一个以“noh”开头的函数)::noh。或者您可以使用长版本::nohlsearch

为了极大地方便(我发现自己可能每天切换hlsearch 20次左右),您可以映射某些内容来切换hlsearch,如下所示:

" search highlight toggle
nnoremap <silent> <leader>st :set hlsearch!<cr>

.:. 如果您的<leader>\(默认情况下是这样),您可以在正常模式下快速按下\st来切换hlsearch

或者您可能只想映射:noh

" search clear
nnoremap <silent> <leader>sc :nohlsearch<cr>

上面的代码简单地运行了:nohlsearch,因此(不像:set hlsearch!),下次你在normal模式下按下*#时它仍会高亮显示单词。
祝好。

1
这应该是被接受的答案,因为它恰当地解释了事情。 - Jay-Pi
1
两个映射中都应该使用大写字母N,因为默认情况下,N会在相反的方向上搜索。 - markmarkmark
这绝对应该是被采纳的答案。非常扎实的回答。谢谢! - Swivel

4
例如这些插件:

只需在 vimawesome.com 中搜索光标下方即可。

正如clagccs所提到的那样,关键在于高亮不会与您的搜索冲突https://vim.fandom.com/wiki/Auto_highlight_current_word_when_idle

如何不与搜索冲突的屏幕截图: enter image description here 注:

  • vim-illuminate默认进行高亮,但我在我的屏幕截图中切换到了下划线
  • vim-illuminate默认会在光标下高亮/下划线单词,但我在我的屏幕截图中取消了它
  • 我的配色方案非常灰色。 您可以自定义您的配色方案。

3
首先确保启用了hlsearch,方法是输入以下命令:
:set hlsearch

您可以将以下内容添加到您的 .vimrc 文件中作为 set 命令。
set hlsearch

现在当您在命令模式或正常搜索命令中使用快速搜索机制时,所有结果都将被突出显示。要在结果之间向前移动,请按“n”,要向后移动,请按“N”。
在正常模式下,要执行单个命令中光标下单词的快速搜索并跳转到下一个出现位置,请按“*”,您还可以通过按“#”搜索光标下的单词并移动到上一个出现位置。
在正常模式下,也可以使用快速搜索来调用。
/searchterm<Enter>

要去除出现的高亮显示,我已将其绑定到我的 .vimrc 快捷键中。

:nohl

2

启用搜索高亮:

:set hlsearch

然后搜索以下单词:
/word<Enter>

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