完成搜索后,如何自动关闭“ hlsearch”?


19

我喜欢“ hlsearch”设置,但是搜索完成后,我发现它令人讨厌。特别是当我搜索具有很多匹配项的内容时。我知道我可以用

:set nohlsearch

但这需要整个16次击键,更烦人的是,我必须再次打开它才能进行下一次搜索

:set hlsearch    

有什么方法可以让hlsearch在开始搜索时自动打开,而在搜索完成后自动关闭?例如,如果我进入插入模式或修改文本,hlsearch是否已关闭而没有任何其他按键操作?


3
自动定义。
— 安东尼

@Antony与之类似,如果我要进行编辑或处于插入模式,它将关闭,而无需我按任何按钮。如果我开始使用/或进行搜索?,或者如果我按n或进行搜索N,则它将打开而无需按任何其他按钮。
— DJMcMayhem

1
哦,定义“完成”搜索
— Christian Brabandt,2016年

1
:nno <BS> :set hls!\|set hls?<CR>-一行,一键按下,状态反馈,并且在您可能想要或可能不希望突出显示时不进行任何猜测。有时我想在编辑时在屏幕上向左突出显示。有时我不这样做,例如/与操作员一起动作。
— 安东尼

nnoremap <M-\> :set hlsearch!<CR><Bar>:echo 'hlsearch: ' . ['Off', 'On'][&hlsearch]<CR>
— 佐藤桂

Answers:


26

有一种更方便的方法。而不是使用

:set nohlsearch

实际上会关闭hlsearch设置,请使用

:nohls

这只会关闭hlsearch,直到您再次搜索。从:help nohls

                 *'hlsearch'* *'hls'* *'nohlsearch'* *'nohls'*
'hlsearch' 'hls'    boolean (default off)
            global
            {not in Vi}
            {not available when compiled without the
            |+extra_search| feature}

    ...

    When you get bored looking at the highlighted matches, you can turn it
    off with |:nohlsearch|.  This does **not change the option value**, as
    soon as you use a search command, the highlighting comes back.

但是,此解决方案并不完美,因为您仍然必须:nohls在每次搜索后都输入要执行的操作。您可以通过映射解决此问题,例如

nnoremap <esc><esc> :silent! nohls<cr>

但是,还有一个更好的解决方案!haya14busa / incsearch.vim。至少在我看来,这是必不可少的 vim插件。主要功能是,当您键入正则表达式时,所有搜索匹配项都会实时突出显示。例如:

在此处输入图片说明

但是,还提供了一个辅助功能,该选项可以在您开始/停止搜索时立即打开或关闭hlsearch。要启用此功能,您必须添加

set hlsearch
let g:incsearch#auto_nohlsearch = 1
map n  <Plug>(incsearch-nohl-n)
map N  <Plug>(incsearch-nohl-N)
map *  <Plug>(incsearch-nohl-*)
map #  <Plug>(incsearch-nohl-#)
map g* <Plug>(incsearch-nohl-g*)
map g# <Plug>(incsearch-nohl-g#)

给你.vimrc。

如果还有其他n映射,则必须将其关闭。例如,我曾经有

nnoremap n nzz
nnoremap N Nzz

这两个映射彼此不兼容!


由于您正在做自我回答,因此我建议您也给带来另一个问题set hlsearch。如果您在其中定义了vimrc它,则:noh每次您获取时都会覆盖它vimrc。为了解决这个问题,我有if !&hlsearch | set hlsearch | endif自己的vimrc。(这是插件解决的另一个问题。)
— 恶心的

Dunno,似乎像是一大堆代码和配置,对我而言并没有太多收获。实际上,它使您很难发现增量搜索的目标,从而使快速导航的用处不大。
— 安东尼

+1可以回答一个很棒的插件并做更多的事情!
— RichVel

7

vim-cool是执行此操作的简单插件。

当您完成搜索时,Vim-cool将禁用搜索突出显示,并在再次搜索时重新启用它。

它的工作原理,而不重新映射通过使用了CursorMoved和InsertEnter自动命令。


这种技术(使用自动命令)比我的回答要好得多,而且我不敢相信我写我的时候就没有想到它。赞成。
— Rich

5

我<Leader><Enter>用作的快捷方式:noh。(我的领导人是,,所以非常接近)

这将关闭高亮显示,直到您进行下一次搜索。


3

正如您已经在自己的答案中指出的那样,使用:nohlsearch命令(可以缩写为:noh)关闭突出显示要比关闭整个功能然后在下次搜索时重新打开功能要有效得多。

如果您想在每次i进入插入模式时都关闭高亮显示,可以创建一个简单的映射来做到这一点:

:nnoremap i :noh<cr>i

留给读者练习是为其他需要关闭突出显示的命令创建类似的映射。


2

这听起来可能很愚蠢或幼稚,但是当我要停止突出显示时我要做的是搜索(实际上是肯定的)文档中不存在的随机字符串。像这样:

/skljdfhadhfs

当然,它确实需要一些按键,但是它们实际上是随机的,因此可以立即输入。


1
但这使n并且N不再起作用,并且诸如:%s//something或的东西也不再起作用:g//something。它还杂波您的搜索历史记录
— DJMcMayhem

是的,但我的假设(可能是错误的)是,由于您不再需要突出显示内容,因此您也不必关心该特定搜索。如果使搜索历史混乱,它就会成为一个现实问题。
— Kostas,

1

我发现它更直观地重新映射Ctrl- L重绘,包括:nohls:

nnoremap <C-L> :nohls<cr><C-L>

欢迎来到Vi和Vim!感谢您就公认的老问题分享您的知识。正如您可能已经注意到的那样,高质量的答案通常会附带一些有关代码在做什么的解释(这对于可能在没有太多知识的情况下落入此处的新vi​​mmer尤其有用)。对相关:help部分也可能是一个好主意!
— D. Ben Knoble

0

我<Leader><Enter>用作快捷方式,:hls并将我的领导者设置为空间。

let mapleader = "\<Space>"
nmap <silent> <leader><Esc> :set hls!<cr>

搜索后,项目将突出显示,将其关闭,请点击<Space><Esc>。如果您决定要重新显示搜索结果,请点击<Space><Esc>。该hls!方法映射此键绑定来切换设置hls(简写hlsearch,即搜索结果中高亮显示),(所以!切换前的设置正确的话)。


-1

将此宏添加到您的.vimrc

map #h :set hls!<CR>

这将允许您使用#h切换高光


这与James Affleck的回答没有什么不同。
— jamessan '19

我的似乎更简洁。
— Darrel Lee

为什么简明扼要?另一篇文章提供了有关命令各部分含义的更多信息,而本篇文章未提供其他内容。
— jamessan
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.