【问题标题】:Vim clear last search highlightingVim 清除上次搜索突出显示
【发布时间】:2010-10-14 00:49:48
【问题描述】:

在 Vim 中进行搜索后,我会突出显示所有匹配项。我怎样才能禁用它?我现在再次搜索一些无法找到的乱码。

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

【问题讨论】:

  • :set invhlsearch 如果已经高亮,则禁用高亮,否则启用。您可以将其映射为 Shift-H。
  • @StewartJohnson 在我的 .vimrc 文件中这样做似乎会干扰/破坏 :set mouse=a。任何想法为什么?这个错误只发生在 iTerm2
  • 这些年来我已经输入了很多乱码来清除该突出显示(对于多 GB 文本文件来说效率非常低)。乱码搜索本质上是浪费计算时间的第二次搜索。好问题!
  • @StewartJohnson 小心!您对映射的评价最高的评论会导致错误和意外行为,如下面的 cmets 所述,stackoverflow.com/a/1037182/1698467
  • @StewartJohnson 建议的nnoremap <esc> :noh<return><esc> 解决方案在 GUI vim 中运行良好,但在终端中运行 vim 时会导致箭头键和其他 ESC 编码键出现问题。 不要把它放在你的 ~/.vimrc 中而不用if has('gui_running') ... end

标签: vim full-text-search highlight


【解决方案1】:

在下一次搜索之前关闭突出显示:

:noh

或完全关闭突出显示:

set nohlsearch

或者,切换它:

set hlsearch!

nnoremap <F3> :set hlsearch!<CR>

【讨论】:

  • 从这个答案和 cmets 中并不清楚这一点:请注意,set nohlsearch 也会禁用下一次搜索的突出显示。 :noh 的行为非常不同:当您执行新搜索时,甚至当您执行与当前搜索相关的操作时(例如,当您键入 n 转到下一项时),突出显示将自动重新启用。
  • 我将它映射到 因为这是我清理屏幕的首选按键。这是我的映射:nmap &lt;silent&gt; &lt;C-L&gt; &lt;C-L&gt;:nohlsearch&lt;CR&gt;:match&lt;CR&gt;:diffupdate&lt;CR&gt;
  • @Rainning,这是您要放入 .vimrc 的内容吗?如果没有,您可以在 .vimrc 中添加什么以在每次搜索后永久启用 :noh?
  • 2021 年读者:nnoremap &lt;nowait&gt;&lt;silent&gt; &lt;C-C&gt; :noh&lt;CR&gt;.
  • @LiamClink:我已经更新了命令,应该是nnoremap。是的,你应该把它放在你的 .vimrc 中。我不明白你的问题,因为下次你在键盘上敲/并输入一个新的关键字进行搜索,旧的都被替换了,所以你只需要在每次搜索后由&lt;C-C&gt;自己清理.
【解决方案2】:

来自VIM Documentation

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

:let @/ = ""

这不会将模式设置为空字符串,因为那会匹配 到处。模式真的很清晰,就像启动 Vim 时一样。

【讨论】:

  • ...据我了解,这将是解决他的问题的更好方法。
  • 这就是我要找的!我投了赞成票,这个问题有点模糊。这使我认为这就是他想要的:“我现在再次搜索无法找到的乱码”。因为那是我正在做的清除搜索,但没有禁用它,所以下一次搜索会再次突出显示。
  • 这就是我认为的问题...这是我为加快清除搜索字符串(并因此删除所有突出显示)而做出的命令::command C let @/="" 使用它可以让您输入:C 清除搜索字符串...非常快,不会影响以后的搜索或突出显示。
  • @jcreamer898,请参阅有关“寄存器”的 vim 帮助 (:he registers)。 Vim 有几个不同的内置寄存器来保存文本,有时用于提取数据,有时用于最后搜索等。当您进行搜索时,vim 将模式放入“/”寄存器中,您可以使用 @/ 引用它。您还可以使用@regname=value 为寄存器赋值,其中regname 是寄存器的名称。所以,@/="" 只是将寄存器“​​/”设置为空字符串(除了“/”寄存器,如果它包含空字符串,vim 将清除最后一次搜索)。
  • 将此添加到您的 .vimrc 以获得 Ctrl+/ 以清除上次搜索:noremap &lt;silent&gt; &lt;c-_&gt; :let @/ = ""&lt;CR&gt;
【解决方案3】:

你可以的

:noh

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

【讨论】:

  • 谢谢,这很有帮助...返回突出显示的任何命令?
  • :nohs 只是关闭当前突出显示。如果您有 :set hlsearch 那么它将继续突出显示您的搜索。
  • 我认为这就是 OP 正在寻找的内容(尽管 Shaun 的回答也有效)。我赞成这个更短。我知道他接受了 nohls 的答案,但设置它会禁用所有搜索突出显示,即使之后尝试另一个搜索。
  • 这可能是 OP 一开始想要的,并且是最短、最好的答案恕我直言。
  • 即使在凡间也能达到完美!我会使用它而不是:help,并且不想污染 : nnoremap :noh
【解决方案4】:

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

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

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

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

【讨论】:

  • 我认为这是一个比实际被接受的解决方案更好的解决方案——无论是这个解决方案,还是映射到 的另一个解决方案。跨度>
  • 这是对“nnoremap :noh”的更好回答,因为它不会导致奇怪的行为。
  • 需要注意的重要一点,确保不要将任何 cmets 放在重映射的右侧。它们将被解释为重映射的命令,而不是 cmets。
  • 评论错误;该命令不会取消设置最后一个搜索模式,而只是关闭当前结果的突出显示;您可以点击n 查找下一个匹配项(将再次突出显示)。顺便说一句,在编写脚本时,我会避免使用缩写形式,而是写:nohlsearch
  • 添加 以避免显示闪烁并在命令行中留下 noh - :nnoremap :nohlsearch
【解决方案5】:

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

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

mapping to the escape key 需要第二行,因为 Vim 内部使用转义来表示特殊键。

【讨论】:

  • 为了清楚起见,这可以让您通过按 Escape 键清除搜索突出显示
  • 出于某种原因,这使我的终端 vim 启动时就像按下了“c”一样。有什么想法吗?
  • 这在我尝试时引起了一些非常奇怪的行为:在启动时,常规的 vim 移动(例如 j、k)会导致行被删除。 nnoremap :noh 没有引起这些问题。我无法找到根本原因。
  • 嗯,我遇到了和上面一样的问题。除非您喜欢随机删除文本,否则请勿在未经测试的情况下按原样使用...
  • 使用 "nnoremap :noh" 使 vim 总是以 "REPLACEMENT" 模式启动。
【解决方案6】:

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

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

--

(不要这样做)

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

/;alskdjf;

这适用于 vim 和更少,并且比 @ShaunBouckaert 逻辑上更简洁的解决方案“清除上次使用的搜索模式”更容易记住/输入:

:let @/ = ""

一个潜在的缺点是它会将垃圾添加到您的搜索历史中。

【讨论】:

  • 这不仅是一个肮脏的解决方案(我自己一直使用到现在,没有冒犯),另一个缺点是它在窗口底部添加了一个丑陋的红色横幅,上面写着“找不到模式”,这几乎与突出显示本身一样烦人,并且需要丢弃进一步的操作(例如“搜索+退格”)。
  • 它也可能需要几秒钟,因为它实际上搜索整个文件的其余部分。如果文件很大,那真的很烦人。当然,你可以标记你的当前位置,跳到开头,然后向后搜索一个字符,但这同样很脏。
  • 这是大多数人了解:nohl 命令之前会使用的解决方案。一旦我了解了后者,我立即停下来进行这些搜索。
  • 这不是答案;它只是建议做 OP 已经做过的事情:“我现在再次搜索一些无法找到的乱码。”
  • 如果你想要一个简单而简短的模式,只需使用/$4。它不仅不可能匹配任何东西,而且实际上完全不可能。 $ 必须始终跟在换行符之后或者是文件的结尾,并且 4 既不是换行符也不是文件的结尾。 (具体是4的原因,就是在同一个键上,所以打字真的很方便)
【解决方案7】:

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

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

【讨论】:

    【解决方案8】:
    nnoremap <cr> :noh<CR><CR>:<backspace>
    

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

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

    【讨论】:

    • 谢谢。左下角出现的“:noh”让我发疯了,该死的强迫症。
    • 我试图通过执行 nnoremap :noh 将它映射到移动的 cr 但它不起作用,你知道它为什么不起作用吗?
    • 我怀疑你不能将 shift 与 return 结合起来,但我真的不知道。
    • @CharlieParker IIRC 您只能在 [a-z] 和此类字符上使用 shift。
    • 不用:&lt;Backspace&gt;,你可以在nnoremap之后添加&lt;silent&gt;,告诉Vim不要在命令区域显示任何输出:nnoremap &lt;silent&gt; &lt;cr&gt; :noh&lt;CR&gt;&lt;CR&gt;
    【解决方案9】:

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

    我想我会贡献一个我认为在正常模式下有用的映射:

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

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

    此正常模式映射还会在重绘屏幕之前清除最近搜索词的突出显示。我发现这两个功能相辅相成,将一个 CtrlL 一起用于两个操作很方便,而不是创建一个单独的映射来禁用搜索突出显示。

    注意: 使用noremap 而不是map,否则映射将是递归的。

    提示: 我通常将 Caps Lock 重新映射到 Ctrl 以便更轻松地键入此类组合键;执行此操作的详细信息取决于您选择的操作系统/窗口系统(并且与此答案无关)。以下两个提示都包括有关将 Caps Lock 映射到 Ctrl 以及 Esc 的信息:

    【讨论】:

      【解决方案10】:

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

      【讨论】:

        【解决方案11】:

        永久禁用搜索突出显示

        无论何时使用 /

        进行搜索,匹配项都不会突出显示
        :set nohlsearch
        

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

        :noh
        

        :nohlsearch(清除直到按下nN


        ESC 清除突出显示

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

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

        • \(反斜杠)清除突出显示

          nnoremap \ :noh<return>
          
        • 点击 ESC 两次清除亮点

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

        【讨论】:

        • 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 命令。
        【解决方案12】:

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

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

        使用“double”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 &lt;silent&gt; &lt;Esc&gt;&lt;Esc&gt; :let @/=""&lt;CR&gt;
        • 但这就是它所说的 O.o.也许你可以投票?
        • 我支持您的解决方案...这是 IMO 中最好的一个...而且我也支持它.. :)
        • 使用@/="" 清除搜索寄存器的副作用是使n 无法恢复您的搜索。我更喜欢:noh,它将先前的搜索保留在寄存器中以供重复使用。
        【解决方案13】:

        在下一次搜索之前关闭突出显示

        :noh
        

        【讨论】:

          【解决方案14】:

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

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

          【讨论】:

          • 这很容易解决问题。重新映射对我来说太过分了
          【解决方案15】:

          如果你安装了incsearch.vim plugin,那么有一个设置是搜索后自动清除高亮:

          let g:incsearch#auto_nohlsearch = 1
          

          【讨论】:

            【解决方案16】:

            Janus for VIM and GVIM 为像我这样的新手准备了很多东西,包括

            <leader>hs - toggles highlight search
            

            这正是您所需要的。只需在正常模式下输入\hs。 (leader key 默认映射到\。)

            HTH。

            【讨论】:

              【解决方案17】:

              为此有两个“必备”插件:

              1. sensible - Ctrl-l 用于 nohlsearch 和重绘屏幕。
              2. unimpared - [oh]ohcoh 控制 hlsearch。

              【讨论】:

              【解决方案18】:

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

              updatetime 默认为 4000 毫秒或 4 秒,但我将我的设置为 10 秒。请务必注意,updatetime 的作用不止于此,因此请在更改之前阅读文档。

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

              【讨论】:

                【解决方案19】:

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

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

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

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

                【讨论】:

                • 单个干扰方向键是什么意思?
                • @hansmosh 见unix.stackexchange.com/questions/28713/… 我在我的.vimrc 中使用了两行如下nmap &lt;esc&gt;&lt;esc&gt; :noh&lt;return&gt; - to turn off search highlighting and nmap &lt;esc&gt;` :set hlsearch&lt;return&gt; - to turn on search highlighting
                【解决方案20】:

                我个人喜欢将esc 映射到命令:noh,如下所示:

                map &lt;esc&gt; :noh&lt;cr&gt;

                I wrote a whole article recently about Vim search: 如何在 vanilla Vim 上搜索以及增强搜索功能的最佳插件。

                【讨论】:

                  【解决方案21】:

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

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

                  只需将上面的 sn-p 放在你的 .vimrc 文件中。

                  这对我来说是最方便的方式来显示和隐藏搜索突出显示的单键击键

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

                  【讨论】:

                    【解决方案22】:

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

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

                    【讨论】:

                    • 使用@/="" 清除搜索寄存器的副作用是使n 无法恢复您的搜索。我更喜欢:noh,它将先前的搜索保留在寄存器中以供重复使用。你可以将&lt;F3&gt;绑定到nnoremap &lt;F3&gt; :noh&lt;CR&gt;
                    【解决方案23】:

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

                    :nohl

                    【讨论】:

                      【解决方案24】:

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

                      :noremap &lt;F3&gt; :set hls! hls?&lt;CR&gt;

                      【讨论】:

                        【解决方案25】:

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

                        nnoremap &lt;Leader&gt;&lt;space&gt; :noh&lt;Enter&gt;

                        这使得清除当前突出显示的搜索变得非常容易和快速。我的领导键映射到\,所以这使得我的右手小指和拇指很容易执行该操作。

                        【讨论】:

                          【解决方案26】:

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

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

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

                          【讨论】:

                            【解决方案27】:

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

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

                            【讨论】:

                            • 我认为第二个绑定还可以,但第一个很危险。重新映射 &lt;esc&gt; 在 GUI vim 中运行良好,但在终端中运行 vim 时会导致严重问题与箭头键和其他 ESC 编码键。 不要把它放在你的 ~/.vimrc 中而不用if has('gui_running') ... end。还可以考虑添加&lt;silent&gt;,以避免在状态栏中闪烁:noh 命令。
                            【解决方案28】:

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

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

                            第一位(:nohl&lt;cr&gt;)清除高亮;第二位 (:&lt;backspace&gt;) 是 clean 命令行的技巧。搜索仍在后台,因此如果您只需点击n,它将重新突出显示并带您到下一个搜索。

                            【讨论】:

                              【解决方案29】:

                              both 行为定义映射,因为 both 都很有用!

                              • 完全清除搜索缓冲区(例如,按下 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 与我按下的第一个 组合, 然后 vim 剩下的箭头键序列是垃圾。不,我还没准备好放弃 hjkl 的箭头键 :)
                              • @Eric 我无法用 gVim 8.2.2824 重现它。你能详细说明一下吗?另外,尝试在&lt;silent&gt;&lt;nowait&gt; 之前进行
                              【解决方案30】:

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

                              command! H let @/=""

                              在您进行搜索并想要清除搜索中的亮点后,只需执行:H

                              【讨论】:

                                猜你喜欢
                                • 2010-10-20
                                • 2011-05-14
                                • 2013-01-29
                                • 2010-12-20
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 2010-10-30
                                相关资源
                                最近更新 更多