Vim清除上次搜索突出显示

Gab*_*mon 1824 vim highlight

在Vim中搜索之后,我突出显示了所有出现的事件.我怎么能禁用它?我现在再做一些无法找到的乱码.

有没有办法暂时禁用突出显示,然后再次需要时重新启用它?

Myk*_*yev 1512

要关闭突出显示直到下一次搜索:

:noh
Run Code Online (Sandbox Code Playgroud)

或者完全关闭突出显示:

set nohlsearch
Run Code Online (Sandbox Code Playgroud)

或者,切换它:

set hlsearch!

nnoremap <F3> :set hlsearch!<CR>
Run Code Online (Sandbox Code Playgroud)

  • 这个答案和评论并不清楚:注意`set nohlsearch`也会禁用下一次搜索的突出显示.`:noh`的行为非常不同:当您执行新搜索时,甚至当您执行与当前搜索相关的操作时(例如,当您键入`n`转到下一个项目时),突出显示将自动重新启用. (151认同)
  • 令人讨厌的是,它可以像搜索乱码字一样快:/ oajf3w9,因为它是键入:noh.我喜欢@avocade的空间键映射解决方案:noh (20认同)
  • 通过设置nohlsearch,当重启vim时突出显示返回.`:能乐更好. (12认同)
  • 没有解释这些实际做了什么和后果.感谢@SkippyleGrandGourou解释其中的一些内容. (9认同)
  • 对于 2021 年的读者:`nnoremap &lt;nowait&gt;&lt;silent&gt; &lt;CC&gt; :noh&lt;CR&gt;`。 (9认同)
  • 为了它的价值,我把它映射到''\ /'`(或任何你的领导者):`map <Leader> /:nohlsearch <CR>` (3认同)
  • 我将它映射到 &lt;Ctrl-L&gt; 因为这是我清理屏幕的首选键。这是我的映射:`nmap &lt;silent&gt; &lt;CL&gt; &lt;CL&gt;:nohlsearch&lt;CR&gt;:match&lt;CR&gt;:diffupdate&lt;CR&gt;` (3认同)
  • 我只是快速输入/ kkk来摆脱搜索突出显示,因为你在文件中有"kkk"的可能性非常低. (2认同)

Sha*_*ert 670

来自VIM文档

要清除上次使用的搜索模式:

:let @/ = ""
Run Code Online (Sandbox Code Playgroud)

这不会将模式设置为空字符串,因为它会匹配到处.模式真的被清除了,就像启动Vim一样.

  • ......据我理解,这将是他问题的更好解决方案. (127认同)
  • 这就是我认为的问题......这是我用来加快清除搜索字符串的命令(因此删除了所有高亮点):`:command C let @/=""`使用它可以让你输入`:C`清除搜索字符串...非常快,不会影响将来的搜索或突出显示. (48认同)
  • @ jcreamer898,请参阅vim帮助"寄存器"(`:他注册`).Vim有几个不同的内置寄存器,用于保存文本,有时用于抽取数据,有时用于最后一次搜索等.当你进行搜索时,vim将模式放在"/"寄存器中,你用`@ /`引用它.您还可以使用`@regname = value`为寄存器赋值,其中`regname`是寄存器的名称.所以,`@/=""`只是将寄存器"​​/"设置为一个空字符串(除了对于"/"寄存器vim将清除最后一次搜索,如果它包含一个空字符串). (11认同)
  • 这不会禁用搜索,它会清除模式. (10认同)
  • 这就是我要找的!我投票了,问题有点模糊.这让我觉得这就是他想要的:"我现在再做一次寻找无法找到的胡言乱语".因为这是我正在做的清除搜索,但不禁用它,以便下一次搜索将再次突出显示. (8认同)
  • 将其添加到.vimrc中以获取Ctrl + /以清除最后一次搜索:`noremap <silent> <c -_>:let @/=""<CR>` (3认同)
  • 这样做的副作用是,通过清除模式,您将无法通过按“n”重新搜索。我更喜欢“:noh”(绑定到一个键),因为我可以清除突出显示,然后通过按“n”轻松恢复它们。 (3认同)
  • 在过去的 4 年里,我一直像 `nnoremap / :let @/=""&lt;CR&gt;/` 一样绑定它,并且对我来说效果更好。只需再次按“/”即可清除。 (3认同)
  • 通过打开和关闭突出显示,您的答案确实可以更好地回答他的问题.但是,如果问题只是在找到您要查找的内容后,最后一次搜索仍然突出显示,这是我最初理解的问题,那么我的方法可以让您清楚搜索. (2认同)

Mat*_*inn 574

你可以做

:noh
Run Code Online (Sandbox Code Playgroud)

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

  • :nohs只关闭当前的突出显示.如果你有:设置hlsearch,那么它将继续突出显示你的搜索. (16认同)
  • 我认为这是OP正在寻找的东西(虽然肖恩的答案也有效).我推荐这个更短的时间.我知道他接受了nohls的答案,但设置它将禁用所有搜索突出显示,即使之后尝试了另一次搜索. (6认同)
  • 这可能是OP首先想要的,也是最短,最好的答案恕我直言. (5认同)
  • 谢谢,这是有用的...任何返回突出显示的命令? (3认同)

小智 290

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

将以下内容添加到.vimrc:

"This unsets the "last search pattern" register by hitting return
nnoremap <CR> :noh<CR><CR>
Run Code Online (Sandbox Code Playgroud)

因此,在搜索之后,只需在命令模式下再次点击返回,突出显示就会消失.

  • 我认为这是一个比实际被接受的更好的解决方案 - 无论是这一个还是另一个映射到<ESC>的解决方案. (34认同)
  • 添加<silent>以避免显示闪烁并在命令行中留下noh - :nnoremap <silent> <CR>:nohlsearch <CR> <CR> (28认同)
  • 对于"nnoremap <esc>:noh <return> <esc>",这是一个更好的答案,因为它不会导致奇怪的行为. (19认同)
  • 需要注意的一点是,请确保不要在重映射的右侧添加任何注释.它们将被解释为重映射的命令而不是注释. (19认同)
  • 评论错了; 该命令不会**取消设置上一个搜索模式,只是关闭当前结果的突出显示; 你可以点击"n"找到下一个出现的位置(将再次突出显示).顺便说一句,在编写脚本时,我会避免使用缩写形式,而是编写`:nohlsearch`. (12认同)
  • 我喜欢这个,但为什么两个`<CR>?如果要将光标保持在原位,请仅使用1"<CR>" (4认同)
  • 或者将其绑定到Ctrl + L,它清除并重绘屏幕:`nnoremap <CL>:noh <CR> <CL>` (3认同)
  • @Abdo然后你可以*从不*使用Enter向下移动. (2认同)
  • @JonathonReinhart 我明白了,谢谢!问题是,我不使用 Enter,每次我想关闭突出显示时,我的光标位置都会改变,这让我很困扰 :-) (2认同)

Bar*_*ven 136

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

" Clear highlighting on escape in normal mode
nnoremap <esc> :noh<return><esc>
nnoremap <esc>^[ <esc>^[
Run Code Online (Sandbox Code Playgroud)

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

  • 当我尝试它时,这会引起一些非常奇怪的行为:在启动时,常规的vim移动(例如j,k)将导致线被移除.nnoremap <CR>:noh <CR> <CR>没有导致这些问题.我无法追查根本原因. (30认同)
  • 为了清楚起见,这可以让您通过按Esc键清除搜索突出显示 (12认同)
  • 嗯,我和上面的问题一样.除非你想随意删除你的文字,否则不要在没有测试的情况下使用它. (9认同)
  • 由于某种原因,这使得我的终端vim启动就像按下"c"一样.有任何想法吗? (7认同)
  • 使用"nnoremap <esc>:noh <return> <esc>"使vim始终以"REPLACEMENT"模式启动. (7认同)
  • [这个问题](http://stackoverflow.com/questions/11940801/mapping-esc-in-vimrc-causes-bizzare-arrow-behaviour)详细阐述了评论者指出的这种方法的一些问题. (4认同)
  • 我将此功能添加到我的`ctrl-l`键中,该键通常会清除/重绘屏幕.重新映射`esc`总是很棘手 - 我会避免它,因为几乎所有终端都依赖于没有固有代码的键的转义键代码(如箭头键等). (2认同)
  • `nnoremap <esc>:noh <return> <esc>`解决方案在GUI vim中运行良好,但在终端中运行vim时会导致箭头键和其他ESC编码密钥出现严重问题.*如果没有将它包装在`if has('gui_running')`...`end`中,请不要将它放在你的*`〜/ .vimrc`中. (2认同)

mil*_*dev 38

我原来的解决方案(下面)很脏,很浪费.我现在用:noh

与Vim中的许多功能一样,正确的方法通常不易被发现.

-

(不要这样做)

搜索不太可能的字符序列(将主页上的键混搭):

/;alskdjf;

这可以在vim中运行,并且比@ ShaunBouckaert逻辑上更清晰的解决方案"清除最后使用的搜索模式"更容易记忆/输入:

:let @/ = ""

潜在的缺点是它会在您的搜索历史中添加垃圾.

  • 这不仅是一个肮脏的解决方案(我自己直到现在使用,没有冒犯),另一个缺点是它在窗口底部添加了一个丑陋的红色横幅,说"找不到图案",这几乎和突出显示一样令人讨厌本身并需要进一步采取行动(例如"搜索+退格"). (17认同)
  • 这不是答案; 它只是建议做OP已做的事情:"我现在再做一次寻找无法找到的乱码." (7认同)
  • 它也可能需要几秒钟,因为它实际搜索文件的其余部分.如果文件很大,这真的很烦人.当然,你可以标记你当前的位置,跳到开头,然后向后搜索一个角色,但这同样很脏. (5认同)
  • 这是大多数人在**学习`:nohl`命令之前会使用的解决方案.一旦我了解了后者,我立即停下来进行搜索. (5认同)
  • 如果你想要一个万无一失的简短模式,只需使用`/$4`。它不仅不太可能匹配任何东西,而且实际上完全不可能。`$` 必须始终后跟换行符或文件结尾,并且 4 既不是换行符也不是文件结尾。(特别是4的原因只是因为它在同一个键上,所以快速输入真的很容易) (2认同)

sja*_*jas 32

nnoremap <cr> :noh<CR><CR>:<backspace>
Run Code Online (Sandbox Code Playgroud)

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

:就像开始输入一个新命令一样,Backspace清除它并将焦点放回编辑器窗口.

  • 不要执行`:<Backspace>`,你可以在`nnoremap`之后添加`<silent>`告诉Vim不要在命令区域显示任何输出:`nnoremap <silent> <cr>:noh <CR> <CR>`. (7认同)
  • 谢谢.左下角出现的":noh"让我发疯,该死的强迫症. (6认同)

Ant*_*ica 31

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

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

nnoremap <C-L> :nohlsearch<CR><C-L>
Run Code Online (Sandbox Code Playgroud)

默认情况下,CtrlL在Vim中清除并重绘屏幕.许多命令行程序(主要是使用GNU Readline库的程序,如Bash)使用相同的组合键来清除屏幕.此功能在后台运行的进程打印到终端,覆盖前台进程的某些部分的情况下非常有用.

此正常模式映射还会在重新绘制屏幕之前清除最近搜索词的突出显示.我发现这两个功能相互补充,并且可以方便地将两个功能CtrlL一起用于两个操作,而不是创建单独的映射来禁用搜索突出显示.

NB: noremap使用而不是map其他方式,映射将是递归的.

提示:我通常会重新映射Caps Lock,Ctrl以便更轻松地键入此类组合键; 这样做的细节取决于您选择的操作系统/窗口系统(这个答案是偏离主题的).以下两个技巧包括映射信息 Caps Lock,以CtrlEsc:


avo*_*ade 30

重新映射到我的.vimrc.local文件中,快速而又脏,但非常实用:

" Clear last search highlighting
map <Space> :noh<cr>
Run Code Online (Sandbox Code Playgroud)


cav*_*man 26

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


She*_*yar 23

永久禁用搜索突出显示

每次使用搜索时,都不会突出显示匹配项 /

:set nohlsearch
Run Code Online (Sandbox Code Playgroud)

清除突出显示直到下一次搜

:noh
Run Code Online (Sandbox Code Playgroud)

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


按下清除突出显示 ESC

nnoremap <esc> :noh<return><esc>
Run Code Online (Sandbox Code Playgroud)

按下另一个键或自定义地图时清晰突出显示

  • `nnoremap &lt;silent&gt; &lt;esc&gt;:noh &lt;return&gt; &lt;esc&gt;`解决方案在GUI vim中效果很好,但是在终端中运行vim时,箭头键和其他ESC编码键会造成严重问题。*不要把它放在你的`〜/ .vimrc`中,而不要将它包装在`if has('gui_running')`...`end`中。还可以考虑添加`&lt;silent&gt;`,以避免在状态栏中闪烁`:noh'命令。 (2认同)

Pab*_* C. 15

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

nnoremap <silent> <Esc><Esc> :let @/=""<CR>
Run Code Online (Sandbox Code Playgroud)

使用"double" Esc可以删除突出显示,但只要再次搜索,突出显示就会重新出现.


另一种选择:

nnoremap <silent> <Esc><Esc> :noh<CR> :call clearmatches()<CR>
Run Code Online (Sandbox Code Playgroud)

根据vim文档:

clearmatches()

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

    |:match| commands.
Run Code Online (Sandbox Code Playgroud)

  • 用 `@/=""` 清除搜索寄存器的副作用是使 `n` 无法恢复搜索。我更喜欢`:noh`,它将先前的搜索保留在寄存器中以供重用。 (2认同)

arc*_*don 10

要关闭突出显示直到下一次搜索

:noh
Run Code Online (Sandbox Code Playgroud)

视觉插图


00p*_*eus 10

移动光标后立即关闭突出显示:

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


Deq*_*ing 9

如果你安装了incsearch.vim插件,那么有一个设置可以在搜索后自动清除高亮显示:

let g:incsearch#auto_nohlsearch = 1
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Pau*_*ole 8

Janus为VIM和GVIM提供了许多像我这样的新手,包括

<leader>hs - toggles highlight search
Run Code Online (Sandbox Code Playgroud)

这正是你所需要的.只需键入\hs正常模式即可.(\默认情况下,引导键映射到.)

HTH.


dki*_*kin 7

这有两个'必须'的插件:

  1. 明智的 - Ctrl-l对于nohlsearch和重绘屏幕.
  2. unimpared - [oh,]ohcoh控制hlsearch.


Kev*_*Cox 6

这将在updatetime毫秒不活动后清除搜索突出显示.

updatetime默认为4000毫秒或4秒,但我将我的设置为10秒.重要的是要注意,updatetime不仅仅是这样,所以在更改之前阅读文档.

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


Ama*_*nut 6

如果您希望能够快速启用/禁用突出显示,则可以将键映射到

" Press F4 to toggle highlighting on/off, and show current value.
:noremap <F4> :set hlsearch! hlsearch?<CR>
Run Code Online (Sandbox Code Playgroud)

只需将上面的代码片段放在.vimrc文件中即可.

这是我用一键击键显示和隐藏搜索亮点最方便的方式

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


小智 6

我的猜测是,最初的问题不是禁用搜索突出显示,而是简单地清除上次搜索中的突出显示。原始海报提到的搜索乱码字符串的解决方案是我已经使用了一段时间来清除先前搜索中的突出显示的解决方案,但它既丑陋又麻烦。

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

nmap <esc><esc> :noh<return>
Run Code Online (Sandbox Code Playgroud)

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


sky*_*der 5

结合2个最佳答案的另一个解决方案:

"To clear the last used search pattern:
nnoremap <F3> :let @/ = ""<CR>
Run Code Online (Sandbox Code Playgroud)


Str*_*ker 5

我只使用下面的简单 nohl,不需要插件。

:nohl


Mat*_*ieu 5

我个人喜欢映射esc到命令:noh如下:

map <esc> :noh<cr>

我最近写了一篇关于Vim搜索的文章:如何搜索vanilla Vim以及增强搜索功能的最佳插件.