Vim清除最后一个搜索突出显示


1903

在Vim中进行搜索后,我将所有出现的事件突出显示。如何禁用它?我现在再次搜索找不到的乱码。

有没有一种方法可以暂时禁用突出显示,然后在需要时重新启用它?


197
我认为“ nnoremap <esc>:noh <return> <esc>”解决方案是该问题的更完整答案-通过将其放入.vimrc中,可以在搜索以清除突出显示后按<esc>来自上一个搜索(但不会永久禁用突出显示)。
斯图尔特·约翰逊

5
:set invhlsearch将禁用已突出显示的突出显示,如果尚未突出显示则启用。您可以将其映射为Shift-H。
puffadder 2011年

1
@StewartJohnson在我的.vimrc文件中执行此操作似乎会干扰:set mouse = a。有什么想法吗?此错误仅发生在iTerm2中-Charlie
Parker

20
@StewartJohnson小心!您的最高评分评论(带有映射)会导致错误和意外行为,如在以下评论中所述,请
参见

3
nnoremap <esc> :noh<return><esc>@StewartJohnson建议的解决方案在GUI vim中可以很好地工作,但是在终端中运行vim时,会导致箭头键和其他ESC编码键出现问题。 请勿将它 ~/.vimrc包裹在if has('gui_running')...内end
jbyler

Answers:


1585

要关闭高亮显示直到下一次搜索:

:noh

或完全关闭突出显示:

set nohlsearch

或者,要切换它:

set hlsearch!

nnoremap <F3> :set hlsearch!<CR>

14
通过设置nohlsearch,当vim重新启动时,突出显示返回。:noh效果更好。
Dharmit

21
令人讨厌的是,搜索乱码字符串/ oajf3w9可能与输入:noh一样快。我喜欢@avocade将空格键映射到:noh的解决方案
nnyby 2012年

160
从这个答案和评论中还不清楚:请注意,这set nohlsearch也会在以后的搜索中禁用突出显示功能。的行为:noh截然不同:当您执行新搜索时,甚至当您执行与当前搜索相关的操作时(例如,键入n下一个项目时),突出显示将自动重新启用。
Skippy le Grand Gourou 2012年

10
没有解释这些措施的实际作用和后果。感谢@SkippyleGrandGourou解释了其中的一些内容。
詹森·S

3
对于其价值,我将其映射到'\/'(或无论您的领导者是什么):map <Leader>/ :nohlsearch<CR>
brianmearns 2014年

689

VIM文档

要清除最后使用的搜索模式:

:let @/ = ""

这不会将模式设置为空字符串,因为它将在任何地方都匹配。就像启动Vim一样,该模式已真正清除。


129
...据我所知,这将是解决他问题的更好方法。
肖恩·布卡特

8
这就是我想要的!我投票赞成,这个问题有点含糊。这使我认为这就是他想要的:“我现在再次搜索找不到的乱码”。因为那是我清除搜索的工作,但不禁用它,所以下一次搜索将再次突出显示。
粘土人

50
这就是我所想的问题...这是我用来加快清除搜索字符串(并因此删除所有高亮显示)的命令::command C let @/=""使用此命令可以键入内容:C以清除搜索字符串...非常快速且不会影响以后的搜索或突出显示。
杰森

12
@ jcreamer898,请参见“寄存器”(:he registers)上的vim帮助。Vim有几个不同的内置寄存器,用于保存文本,有时用于存储文本数据,有时用于上一次搜索等。进行搜索时,Vim将模式放在“ /”寄存器中,您可以使用来引用@/。您还可以使用@regname=valuewhere regname是寄存器名称为寄存器分配值。因此,@/=""只需将寄存器“​​ /”设置为空字符串(除了对于“ /”寄存器而言,如果vim包含空字符串,它将清除最后的搜索)。
本·戴维斯

3
将此添加到您的.vimrc中,以Ctrl + /清除上一次搜索:noremap <silent> <c-_> :let @/ = ""<CR>
Angrydust 2014年

583

你可以做

:noh

:nohlsearch暂时禁用搜索突出显示,直到下一次搜索。


3
谢谢,这很有帮助...返回高亮显示的任何命令?
加布里埃尔·所罗门2009年

17
:nohs只是关闭当前的突出显示。如果您具有:set hlsearch,它将继续突出显示您的搜索。
greyfade

6
我认为这就是OP正在寻找的内容(尽管Shaun的答案也适用)。我对此表示赞同。我知道他接受了nohls答案,但是设置它将禁用所有搜索突出显示,即使此后再次尝试搜索也是如此。
Thiago Arrais 2012年

5
这可能是OP最初想要的,并且是恕我直言的最短,最佳答案。

即使在这个凡人的境界中也可以达到完美!我将在:help之外使用此功能,并且不想污染<esc>:nnoremap <F1>:noh <CR>
Sam Watkins

305

我几年前在vim.org上找到了这个答案:

将以下内容添加到您的.vimrc中:

"This unsets the "last search pattern" register by hitting return
nnoremap <CR> :noh<CR><CR>

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


36
我觉得这是一个很大比一个更好的解决方案,实际上已经接受了-无论是这一个或者它映射到<ESC>代替另一种。
斯图尔特·约翰逊

20
这是对“ nnoremap <esc>:noh <return> <esc>”的更好的答案,因为它不会引起奇怪的行为。
丹尼斯

19
需要注意的重要一点是,请确保不要在重新映射的右侧添加任何注释。它们将被解释为重映射的命令,而不是注释。
codybuell 2012年

13
评论是错误的;该命令不会取消设置最后的搜索模式,但简单地关掉当前结果的突出显示; 您可以点击n找到下一个匹配项(它将再次突出显示)。顺便说一句,在编写脚本时,我会避免使用缩写形式,而要编写:nohlsearch
Tobias

28
添加<silent>以避免显示闪烁并在命令行中出现noh-:nnoremap <silent> <CR>:nohlsearch <CR> <CR>
Peter N Lewis

137

来自http://twitter.com/jonbho/status/2194406821

" Clear highlighting on escape in normal mode
nnoremap <esc> :noh<return><esc>
nnoremap <esc>^[ <esc>^[

需要第二行 映射到转义键因为Vim内部使用转义来表示特殊键。


12
请注意,这可以让您通过按Escape键清除搜索突出显示
Gavin Miller 2010年

7
由于某种原因,这会使我的终端vim像按“ c”一样启动。有任何想法吗?
雅各布

31
这在我尝试时引起了一些非常奇怪的行为:在启动时,常规的vim运动(例如j,k)会导致删除行。nnoremap <CR>:noh <CR> <CR>不会导致这些问题。我无法找到根本原因。
oasisbob 2011年

9
嗯,我遇到了与上述相同的问题。除非您喜欢随机删除文本,否则请勿未经测试直接使用此内容
Derek Litz

8
使用“ nnoremap <esc>:noh <return> <esc>”使vim始终以“ REPLACEMENT”模式启动。
user1850133 2014年

38

我原来的解决方案(如下)既脏又浪费。我现在用:noh

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

-

(不要这样做)

搜索不太可能的字符序列(将主行上的键混在一起):

/;alskdjf;

这在vim中有效且更少,并且比@ShaunBouckaert的逻辑上更清晰的解决方案“清除上次使用的搜索模式”更容易记住/键入:

:let @/ = ""

潜在的弊端是它会在您的搜索记录中添加垃圾内容。


17
这不仅是一个肮脏的解决方案(我本人到目前为止一直没有使用过,还没有冒犯),另一个缺点是,它在窗口底部添加了一个难看的红色横幅,上面写着“找不到模式”,几乎与突出显示一样令人讨厌。本身,并要求放弃其他操作(例如“搜索+退格键”)。
Skippy le Grand Gourou 2012年

5
由于它实际上会搜索整个文件的其余部分,因此也可能需要花费几秒钟的时间。如果文件很大,那真的很烦。当然,您可以标记当前位置,跳到开头,然后向后搜索一个字符,但这同样很脏。
Blacklight Shining

5
这是大多数了解该:nohl命令之前将使用的解决方案。一旦了解了后者,我便立即停止进行这些搜索。
Tobias

7
这不是答案。它只是建议做OP已经做的事情:“我现在再次搜索找不到的东西。”
恢复莫妮卡-notmaynard 2014年

2
如果您想要一个万无一失的短模式,请使用/$4。匹配任何东西不仅不大可能,而且实际上是完全不可能的。$必须始终在换行符之后,或者必须在文件末尾,并且4既不是换行也不是文件末尾。(特别是4的原因只是因为它在同一个键上,所以输入起来真的很容易)
分号

32

重新映射到我的.vimrc.local文件中,既快捷又脏乱,但功能非常强大:

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

32
nnoremap <cr> :noh<CR><CR>:<backspace>

这样:noh,在enter搜索后点击时,我便摆脱了命令行中显示的内容。

:就像开始输入新命令一样,Backspace将其清除,然后将焦点放回编辑器窗口中。


6
谢谢。左下角显示的“:noh”让我发疯,该死的OCD。
andrewtweber 2014年

我正在尝试通过nnoremap <S-cr>:noh <CR> <CR>将其映射到移位的cr,但是它不起作用,您知道为什么它可能不起作用吗?
查理·帕克

我怀疑您不能将转变与回报结合起来,但是老实说我不知道​​。
sjas 2014年

@CharlieParker IIRC,您只能使用shift [a-z]等字符。
sjas 2015年

7
:<Backspace>您可以仅在<silent>后面添加,nnoremap以告诉Vim在命令区域中不显示任何输出,而不是这样做nnoremap <silent> <cr> :noh<CR><CR>
索伦·比约恩斯塔德

31

建议:noh或的答案:nohlsearch(例如,Matt McMinn的答案)对于暂时禁用搜索突出显示是正确的-如原始问题中所述。

我以为我会贡献一个在普通模式下有用的映射:

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

默认情况下,CtrlLVim会清除并重画屏幕。许多命令行程序(大多数是使用GNU Readline库的程序,例如Bash)使用相同的组合键来清除屏幕。在后台运行的进程打印到终端,覆盖前台进程的某些部分的情况下,此功能很有用。

在重新绘制屏幕之前,此“普通”模式映射还清除了最近搜索词的突出显示。我发现这两个功能是相辅相成的,使用起来很方便CtrlL起来比创建一个单独的映射来禁用搜索突出显示更方便。

注意: noremap使用而不是map其他方式,映射将是递归的。

提示:我通常会重新映射Caps LockCtrl使其更容易键入此类组合键;执行此操作的详细信息取决于您选择的OS /窗口系统(对于此答案而言,该主题是不正确的)。以下两个技巧均包含有关映射Caps Lock到的信息 Ctrl以及Esc


26

我通常映射:noh到反斜杠键。要重新启用突出显示,只需点击n,它将再次突出显示。


24

永久禁用搜索突出显示

您使用进行搜索时,匹配项不会突出显示 /

:set nohlsearch

清除高亮显示,直到下一次搜索

:noh

:nohlsearch(清除直到n或被N按下)


按下时清除高亮显示 ESC

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

在按下另一个键或自定义地图时清除突出显示的内容

  • 按下时清除高光\(反斜杠)

    nnoremap \ :noh<return>
    
  • 击中ESC两次时的亮点

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

2
nnoremap <silent> <esc> :noh<return><esc>解决方案在GUI vim上运行良好,但是在终端上运行vim时,会导致箭头键和其他ESC编码键严重问题请勿将它 ~/.vimrc包裹在if has('gui_running')...内end。还可以考虑添加,<silent>以避免:noh在状态栏中闪烁命令。
jbyler

17

这是我使用的(从许多不同的问题/答案中摘录):

nnoremap <silent> <Esc><Esc> :let @/=""<CR>

使用“双精度” Esc可以删除突出显示的内容,但是一旦再次搜索,突出显示的内容就会重新出现。


另一种选择:

nnoremap <silent> <Esc><Esc> :noh<CR> :call clearmatches()<CR>

根据vim文档:

clearmatches()

    Clears all matches previously defined by |matchadd()| and the

    |:match| commands.

我在最佳解决方案中遇到了一些错误,因此可以节省您尝试所有答案的时间。使用此解决方案!编辑您.vimrc的内容并将其输入以下内容:nnoremap <silent> <Esc><Esc> :let @/=""<CR>
user1336087 '16

但这就是它的意思,噢,也许您可​​以投票赞成?
Pablo Olmos de Aguilera C.

我正在支持您的解决方案...这是最好的IMO ...而且我也对此表示赞同.. :)
user1336087

1
用清除搜索寄存器具有@/=""使n返回的搜索不起作用的副作用。我更喜欢:noh将先前的搜索保留在寄存器中以供重复使用。
jbyler


10

如果您安装了incsearch.vim插件,那么可以进行以下设置以在搜索后自动清除突出显示的内容:

let g:incsearch#auto_nohlsearch = 1

在此处输入图片说明




7

移动光标后立即关闭高亮显示:

安装vim-cool。创建它是为了解决此特定问题。一旦移动光标,它就会关闭突出显示。请注意,它需要最新的vim版本!


6

这将在之后清除搜索突出显示 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

通过组合2个最重要的答案来解决另一问题:

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

用清除搜索寄存器具有@/=""使n返回的搜索不起作用的副作用。我更喜欢:noh将先前的搜索保留在寄存器中以供重复使用。您可以<F3>使用nnoremap <F3> :noh<CR>
jbyler



4

我的猜测是,最初的问题不是禁用搜索突出显示,而是仅清除上一次搜索中的突出显示。最初的发帖人提到,搜索乱码的解决方案是我一段时间以来一直在使用的一种方法,目的是清除上一次搜索中的突出显示内容,但这很丑陋且麻烦。

我发现要添加nnoremap ...到〜/ .vimrc中的一些建议可以在启动时将vim置于替换模式,这根本不是我想要的。我找到的最简单的解决方案是添加行

nmap <esc><esc> :noh<return>

到我的〜/ .vimrc。这顺应了KISS原理,并且不会干扰箭头键,使用单个<esc>会起作用。在命令模式下(或在插入或替换模式下为三键<esc>),需要使用double- <esc>来清除先前搜索中的突出显示,但是从UI角度来看,这使操作尽可能简单。


单个<esc>干扰箭头键是什么意思?
hansmosh

1
@hansmosh参见unix.stackexchange.com/questions/28713/… 我在.vimrc中使用两行,如下所示 nmap <esc><esc> :noh<return> - to turn off search highlighting and nmap <esc>` :set hlsearch<return> - to turn on search highlighting
Lindsay Haisley

4

我在我使用以下内容 ~/.vimrc

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

这使得清除当前突出显示的搜索变得非常容易和快捷。我的前导键已映射到\该位置,因此使用右手小指和拇指可以轻松执行该操作。


3

我认为混合@ShaunBouckaert和09年3月19日在16:22的答案是一个很好的折衷方案:

" Reset highlighted search
nnoremap <CR> :let @/=""<CR><CR>

Enter,突出显示的文本将不再突出显示,而搜索突出显示仍处于启用状态。


3

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

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


3

根据@ baruch-even答案,您可以ESC正常模式下双击删除搜索词:

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

我认为第二个绑定是可以的,但是第一个是危险的。重新映射<esc>在GUI vim中可以很好地工作,但是在终端中运行vim时,会导致箭头键和其他ESC编码键的严重问题请勿将它 ~/.vimrc包裹在if has('gui_running')...内end。还可以考虑添加,<silent>以避免:noh在状态栏中闪烁命令。
jbyler

1

我也不喜欢 我发现输入代码:nohl一直很烦...所以我将以下映射放入.vimrc

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

第一位(:nohl<cr>)清除突出显示;第二个位(:<backspace>)是清除命令行的技巧。搜索仍在后台进行,因此,如果您直接单击n它,它将重新突出显示并转到下一个匹配项。


1

我将此添加到我的vimrc文件中。

command! H let @/=""

搜索后,要清除搜索中的突出显示内容,只需执行 :H


1

您也可以在.vimrc文件上添加映射,如下所示:

nmap <C-N>:nohlsearch

然后你可以按

Ctrl + N

随时清除突出显示的文本


编辑您的答案,以确保它可以改善此问题中已经存在的其他答案。
hongsy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.