Vim清除上次搜索的高亮显示

2340
在 Vim 中进行搜索后,所有出现的内容都会被高亮显示。如何关闭这个功能?我现在搜索一些无意义的内容以使其取消高亮显示。
是否有一种方法可以暂时禁用高亮显示,并在需要时重新启用它?

7
如果已经高亮显示,:set invhlsearch 命令将取消高亮显示;如果没有高亮显示,则会开启高亮显示。你可以将其映射为 Shift-H。 - puffadder
1
@StewartJohnson 在我的 .vimrc 文件中这样做似乎会干扰/破坏 :set mouse=a。你有什么想法吗?这个错误只在 iTerm2 中发生。 - Charlie Parker
多年来,我打了很多无意义的东西来清除那个高亮(对于多GB文本文件来说真的非常低效)。这种无意义的搜索实际上是第二次搜索,浪费了计算时间。好问题! - Megatron
24
@StewartJohnson小心!你的最受欢迎的评论与映射会导致错误和意外行为,就像下面评论中对https://dev59.com/3HRB5IYBdhLWcg3wV116#1037182所述的那样。 - skywinder
@StewartJohnson,不知何故这个“nnoremap”会破坏鼠标滚动(iTerm,vim8)。但如果手动输入“:noh”,它就能正常工作。 - vigilancer
12
@StewartJohnson 建议使用 nnoremap <esc> :noh<return><esc> 在 GUI Vim 中能够很好地解决问题,但是在终端中运行 Vim 时,会导致箭头键和其他 ESC 编码键出现问题。如果不在 ~/.vimrc 中加入 if has('gui_running') ... end 的包装,请勿将其放入其中。 - jbyler
33个回答

7

updatetime毫秒内没有任何操作,搜索高亮将被清除。

updatetime默认为4000ms或4s,但我将其设置为10s。需要注意的是,updatetime不仅仅是执行这个功能,所以在更改之前请阅读文档。

function! SearchHlClear()
    let @/ = ''
endfunction
augroup searchhighlight
    autocmd!
    autocmd CursorHold,CursorHoldI * call SearchHlClear()
augroup END

6

如果您想快速启用/禁用高亮功能,可以将一个按键映射到该功能。

" Press F4 to toggle highlighting on/off, and show current value.
:noremap <F4> :set hlsearch! hlsearch?<CR>

只需将上述片段放入您的 .vimrc 文件中即可。

这是我用单个按键显示和隐藏搜索高亮的最方便的方式

有关更多信息,请查阅文档http://vim.wikia.com/wiki/Highlight_all_search_pattern_matches


5

结合前两个答案的另一种解决方案:

"To clear the last used search pattern:
nnoremap <F3> :let @/ = ""<CR>

使用@/ =""清除搜索寄存器会导致n无法获取您的搜索结果。我更喜欢使用:noh,它可以将先前的搜索结果保留在寄存器中以供重复使用。您可以使用nnoremap <F3>:noh<CR><F3>绑定到该命令上。 - jbyler

4

您可以使用:noremap来开启/关闭搜索结果高亮,像这样:

:noremap <F3> :set hls! hls?<CR>


4

我在~/.vimrc文件中使用以下内容:

nnoremap <Leader><space> :noh<Enter>

这使得清除当前高亮搜索非常简单快捷。我的领袖键映射到\,所以这使得动作非常容易用右手小指和拇指完成。


3

我也不喜欢这个。每次输入:nohl都感到很烦 ... 所以我在我的.vimrc中添加了以下映射:

noremap <C-_> :nohl<cr>:<backspace>

第一部分(:nohl<cr>)是清除高亮显示的命令;第二部分(:<backspace>)是一个技巧,用来“清洗”命令行。搜索仍然在后台运行,所以如果你只是按下n,它就会重新高亮显示并带你到下一个匹配项。


3
我认为混合使用@ShaunBouckaert和Mar 19 '09 at 16:22的回答是一个很好的妥协方案:
" Reset highlighted search
nnoremap <CR> :let @/=""<CR><CR>

按下 Enter 键后,高亮文本将不再高亮显示,但搜索高亮仍然启用。

3

根据@baruch-even的回答,在正常模式下,你可以通过双击ESC键来删除搜索词:

nnoremap <esc> :let @/ = ""<return><esc>
nnoremap <esc>^[ <esc>^[

我认为第二个绑定是可以的,但第一个很危险。在GUI vim中重新映射<esc>效果很好,但是在终端中运行vim时,会导致箭头键和其他ESC编码键出现严重问题。在~/.vimrc中不要直接使用它,而是用if has('gui_running') ... end包装它。还要考虑添加<silent>以避免在状态栏中闪烁:noh命令。 - jbyler

3

定义映射来支持两种行为,因为两种都很有用!

  • 完全清空搜索缓冲区(例如按下n键以查找下一个匹配项时不会恢复搜索)
  • 保留搜索缓冲区,并切换搜索结果的高亮显示开/关状态(例如按下n键将恢复搜索,但高亮显示将基于切换的当前状态)
" use double-Esc to completely clear the search buffer
nnoremap <silent> <Esc><Esc> :let @/ = ""<CR>
" use space to retain the search buffer and toggle highlighting off/on
nnoremap <silent> <Space> :set hlsearch!<CR>

如果我按下<Esc>,然后再按箭头键,它会破坏缓冲区内容,因为箭头键前面的Esc与我按下的第一个<Esc>组合在一起,vim只剩下垃圾的箭头键序列。不,我还没有准备放弃使用hjkl的箭头键 :) - Eric
@Eric 我无法在 gVim 8.2.2824 中重现它。你能详细说明一下吗?另外,请尝试在 <silent> 前加上 <nowait> - john c. j.
不幸的是,像这样重新映射 <esc> 键通常会在退出插入模式时导致令人讨厌的延迟。请参见 https://vi.stackexchange.com/questions/16148/slow-vim-escape-from-insert-mode。 - apostl3pol

2

不建议使用nohlsearch的任何解决方案,那么下一个搜索怎么办?最好的答案是通过让@/ = ""来创建,但我不喜欢在Mac上通过功能键映射,所以这是我的方法:

let mapleader=','
let g:mapleader=','
nnoremap <leader>cs :let @/ = ""<cr>

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