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个回答

2059
要在下一次搜索之前关闭高亮,请执行以下操作:
:noh

或者完全关闭高亮:

set nohlsearch

或者,要切换它:

set hlsearch!

nnoremap <F3> :set hlsearch!<CR>

211
这个答案和评论并没有清楚地表明:set nohlsearch指令会禁用下一次搜索的高亮显示。而:noh命令的行为非常不同:当你执行新的搜索或者进行与当前搜索相关的操作(例如按下 n 键跳转到下一个选项)时,高亮显示会自动重新启用。 - Skippy le Grand Gourou
5
我将它映射到<Ctrl-L>,因为那是我清理屏幕的常用按键。这是我的映射代码:nmap <silent> <C-L> <C-L>:nohlsearch<CR>:match<CR>:diffupdate<CR> - joeytwiddle
9
针对2021年的读者: nnoremap <nowait><silent> <C-C> :noh<CR> 的意思是在Vim编辑器中,按下Ctrl+C键将会禁用搜索高亮并清除当前搜索结果。 - VimNing
在~/.vimrc中使用“set nohlsearch”可以永久禁用搜索高亮,但是当我输入搜索时,vim仍然会突出显示文本,这让我非常分心。是否有办法也关闭它?我在vim 8.2中观察到了这一点。 - brookbot
@Rainning 真的是我需要的!非常喜欢 <nowait><silent> 这个组合。谢谢! - kohane15
显示剩余4条评论

820
VIM 文档 中得知:
清除最近使用的搜索模式:
:let @/ = ""

这不会将模式设置为空字符串,因为那样会匹配任何地方。实际上,该模式被清除了,就像开始使用 Vim 一样。


143
据我的理解,这将是一个更好的解决方案来解决他的问题。 - Shaun Bouckaert
9
这正是我一直在寻找的!我投了赞成票,但这个问题稍微有点模糊。这让我想到他想要的是:“我现在再搜索一些无意义的东西,以便使之无法被找到。” 因为这就是我所做的,以清除搜索记录,但不禁用它,这样下次搜索时还会被突出显示。 - claytron
56
这是我认为问题的内容...这是一个我制作的命令,可以快速清除搜索字符串(因此删除所有高亮显示)::command C let @/="" 使用它可以输入 :C 来清除搜索字符串...非常快速,不会影响未来的搜索或高亮显示。 - Jason
16
@jcreamer898,可以查看Vim帮助文档中有关“寄存器”(:he registers)的部分。Vim内置了几个不同的寄存器来保存文本,有时是用于复制的数据,有时是用于最后一次搜索等。当你进行搜索时,Vim会将模式存储在“/”寄存器中,你可以使用@/来引用它。你还可以使用@regname=value来为寄存器分配值,其中regname是寄存器名称。因此,@/=""仅仅是将“/”寄存器设置为空字符串(但对于“/”寄存器,如果它包含一个空字符串,Vim将清除最后一次搜索)。 - Ben Davis
9
在您的 .vimrc 文件中添加以下内容,以使 Ctrl+/ 可以清除上一次的搜索记录:noremap <silent> <c-_> :let @/ = ""<CR> - angrydust
显示剩余16条评论

648

你可以这样做

:noh

或者使用:nohlsearch暂时禁用搜索高亮,直到下一次搜索。


3
谢谢,这很有帮助。...有没有返回高亮的命令? - Gabriel Solomon
21
:nohlsearch 命令会取消当前的高亮显示。如果你使用了 :set hlsearch 命令,则会继续高亮显示你的搜索结果。 - greyfade
6
我认为这就是原帖作者寻找的内容(尽管Shaun的回答也有效)。我点赞它因为它更短。我知道他已经接受了nohls的答案,但设置它会禁用所有搜索高亮,即使之后尝试进行另一个搜索也是如此。 - Thiago Arrais
5
在我看来,这可能是原帖作者最初想要的,并且是最简短、最好的答案。 - user195488
即使在这个凡人的世界中,完美也是可以实现的!我会更多地使用它而不是 :help,并且不想污染 <esc>:nnoremap <F1>:noh<CR> - Sam Watkins
每次手动设置不比手动清除好。Shaun的答案更好。 - Ed_

361
我数年前在vim.org上找到了这个答案:
将以下内容添加到您的.vimrc文件中:
"This unsets the "last search pattern" register by hitting return
nnoremap <CR> :noh<CR><CR>

因此,在搜索后,只需在命令模式下再次按回车键,高亮显示就会消失。

43
我认为这个解决方案比实际被接受的那个好得多——无论是这一个还是将其映射到<ESC>的另一个。 - Stewart Johnson
23
这是对“nnoremap <esc>:noh<return><esc>”更好的答案,因为它不会引起奇怪的行为。 - Dennis
20
需要注意的一件事是,确保您不在重映射的右侧放置任何注释。否则它们将被解释为对于重映射的命令,而非注释。 - codybuell
15
评论是错误的;该命令不会取消最后一个搜索模式,而只是关闭当前结果的高亮显示;你可以按n查找下一个出现的位置(它将再次被突出显示)。顺便说一下,在编写脚本时,我建议避免使用缩写形式,而应该写成:nohlsearch - Tobias
39
为避免命令行界面闪烁并保持无高亮的状态,添加 "<silent>"。修改命令为:":nnoremap <silent> <CR> :nohlsearch<CR><CR>"。 - Peter N Lewis
显示剩余5条评论

152

13
清楚明白地说,这个功能允许你通过按下Esc键来清除搜索结果的高亮显示。 - Gavin Miller
7
不知何故,这使我的终端 vim 启动时好像按下了“c”键。有什么想法吗? - Jacob
32
当我尝试时,这引起了一些非常奇怪的行为:在启动时,常规的vim移动(例如j,k)会导致行被删除。 nnoremap <CR>:noh<CR><CR>没有出现这些问题。我无法追踪到根本原因。 - oasisbob
9
嗯,我和上面的人一样遇到了同样的问题。如果你不想随机删除文本,请在测试后再使用此功能。 - Derek Litz
9
使用“nnoremap <esc> :noh<return><esc>”命令可以让Vim始终处于“替换模式”。 - user1850133
显示剩余8条评论

47

我的原始解决方案(如下)很糟糕且浪费。现在我使用:noh

像Vim中的许多功能一样,正确的方式通常不容易发现。

--

(不要这样做)

搜索一个不太可能出现的字符序列(在主键上按键):

/;alskdjf;

这适用于vim和less,并且比@ShaunBouckaert更符合逻辑但难记/打的方案:“清除最后使用的搜索模式”:

:let @/ = ""

潜在的缺点是它会向您的搜索历史记录中添加垃圾信息。


25
这不仅是个不太优雅的解决方法(我自己之前也用过,不是针对你),而且还会在窗口底部添加一个难看的红色横幅,上面写着“未找到匹配项”,几乎和高亮本身一样让人烦恼,需要再进行一些操作才能将其丢弃(例如,“搜索+退格”)。 - Skippy le Grand Gourou
6
它实际上会搜索整个文件,这可能需要几秒钟的时间。如果文件很大,那真的很烦人。当然,你可以标记当前位置,跳到开头,然后向后搜索字符,但这同样很麻烦。 - Blacklight Shining
6
在了解:nohl命令之前,大多数人会使用这个解决方案。一旦我了解了后者,就立即停止了进行这些搜索。 - Tobias
10
这不是一个答案,只是建议做和提问者已经在做的一样:“我现在会搜索一些无法找到的无意义内容”。 - Reinstate Monica -- notmaynard
4
如果您想要一个简单且百分之百可靠的模式,请使用/$4。它不仅不太可能匹配任何东西,而且实际上完全不可能。 $必须始终跟随一个换行符或者是文件末尾,而4既不是换行符也不是文件末尾。(之所以特别选用4,只是因为它在同一按键上,所以很容易快速输入) - semicolon
显示剩余2条评论

42
nnoremap silent <cr> :noh<cr><cr>
那么,当我按下搜索后按下enter键时,就会消除命令行中显示的:noh:类似于开始输入新命令,Backspace清除它并将焦点放回编辑器窗口。

7
谢谢。底部左侧显示的“:noh”让我疯狂,该死的强迫症。 - andrewtweber
我试图通过 nnoremap <S-cr> :noh<CR><CR> 将其映射到 shifted cr,但它没有起作用,你知道为什么吗? - Charlie Parker
我怀疑你不能将shift与return组合使用,但是我真的不知道。 - sjas
@CharlieParker 如果我没记错的话,你只能在 [a-z] 和类似字符上使用 shift。 - sjas
13
不必使用 :<Backspace>,只需要在 nnoremap 后添加 <silent> 即可告诉 Vim 不显示命令区域的任何输出:nnoremap <silent> <cr> :noh<CR><CR> - Soren Bjornstad
@SorenBjornstad的答案已经更新,包含了您的建议。 - sjas

39

以下是需要翻译的内容:

提出使用:noh或者:nohlsearch(例如Matt McMinn的回答)来暂时禁用搜索高亮显示,这是针对原始问题的正确答案。

我想贡献一个在Normal模式下我觉得很有用的映射:

nnoremap <C-L> :nohlsearch<CR><C-L>

默认情况下,Vim中的CtrlL清除并重新绘制屏幕。许多命令行程序(大多数使用GNU Readline库,如Bash)使用相同的组合键来清除屏幕。在后台运行的进程向终端打印并覆盖前台进程的部分内容时,此功能非常有用。
此普通模式映射还会在重新绘制屏幕之前清除大多数最近搜索词的高亮显示。我发现这两个功能互补,使用一个CtrlL同时执行两个操作比创建一个单独的映射来禁用搜索高亮更方便。
注意:使用noremap而不是map,否则映射将是递归的。

提示:我通常会将Caps Lock键映射为Ctrl键,以便更轻松地输入这些键组合;具体操作取决于您选择的操作系统/窗口管理器(这与本答案无关)。以下两个提示都包括将Caps Lock键映射为CtrlEsc的信息:


35

我在我的 .vimrc.local 文件中将其重新映射到<leader>,很快也很实用:

" Clear last search highlighting
map <Space> :noh<cr>

30

永久禁用搜索结果高亮显示

无论何时使用/进行搜索,匹配结果都不会被高亮显示。

:set nohlsearch
清除高亮直到下一次搜索。
:noh

或者:nohlsearch(清除直到按下nN为止)


按下ESC键清除高亮显示

nnoremap <esc> :noh<return><esc>

按下其他键或自定义映射时清除高亮

  • 按下\(反斜杠)可清除高亮

    nnoremap \ :noh<return>
    
  • 按两次ESC清除高亮显示

  • nnoremap <esc><esc> :noh<return>
    

6
在GUI版的vim中,“nnoremap <silent> <esc> :noh<return><esc>”解决方案效果良好,但是在终端中运行vim时,会导致箭头键和其他编码为ESC的键出现严重问题。在将其放入“~/.vimrc”之前,请务必添加“if has('gui_running')” ... “end”来进行包装。还可以考虑添加“<silent>”,这可以避免在状态栏中闪烁“:noh”命令。 - jbyler

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