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

:set nohlsearch


将其关闭,但这需要整个16次击键,更烦人的是,我必须将其重新打开以便进行下一次搜索使用

:set hlsearch    


有没有一种方法可以让hlsearch在开始搜索时自动打开,而在完成搜索时自动关闭?例如,如果我进入插入模式或修改文本,是否在没有任何其他按键的情况下关闭hlsearch?

评论

自动定义。

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

哦,定义“完成”搜索

:nno :set hls!\ |设置hls?-一行,一键按下,状态反馈,并且在您可能想要或不希望突出显示时都不会进行第二次猜测。有时我想在编辑时在屏幕上向左突出显示。有时我不这样做使用/作为操作员的动作。

nnoremap :set hlsearch! :echo'hlsearch:'。 ['Off','On'] [&hlsearch]

#1 楼

有一种更方便的方法。与其使用实际上会关闭hlsearch设置的

:set nohlsearch


,不如使用

: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。要启用此功能,您将必须在您的.vimrc中添加

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#)




如果您还有其他n映射,则将具有将其关闭。例如,我以前有

nnoremap n nzz
nnoremap N Nzz


这两个映射彼此不兼容!

评论


由于您正在做一个自我回答,因此我建议您也使用set hlsearch添加另一个问题。如果您在vimrc中定义了它,则每次您获取vimrc时,它将覆盖:noh。如果要解决这个问题,我可以使用!&hlsearch |设置hlsearch | endif在我的vimrc中。 (这是插件解决的另一个问题。)

–grochmal
16年7月12日在17:59



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

– Antony
16年7月12日在19:48

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

– RichVel
17年2月2日于16:04

#2 楼

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

通过使用CursorMovedInsertEnter自动命令,无需重新映射即可工作。

评论


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

–丰富
17年8月30日在12:35

#3 楼

我使用<Leader><Enter>作为:noh的快捷方式。 (我的主管是,,所以非常接近)

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

#4 楼

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

如果要在每次使用i进入插入模式时都关闭高亮显示,则可以创建一个简单的映射来做到这一点: />作为练习,读者可以为要关闭突出显示功能的其他命令创建类似的映射。

较新版本的Vim具有InsertEnter自动命令,您可能会认为该命令可以轻松使用创建更清晰的关闭高亮显示的实现,但是不幸的是,:nohlsearch命令在自动命令中无效。可能的解决方法是在进入插入模式时重置搜索模式,但这显然具有您可能不希望看到的副作用:

:nnoremap i :noh<cr>i


但是有一个更好的选择技术,即使用自动命令中的feedkeys。这就是乔恩·巴黎(Jon Parise)的答案中提到的vim-cool插件。

#5 楼

我发现重新映射Ctrl-L重绘以包括:nohls更加直观:

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


评论


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

– D. Ben Knoble♦
19/12/19在22:48

#6 楼

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

/skljdfhadhfs


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

评论


但这使n和N不再起作用,也使诸如:%s // something或:g // something之类的东西失效。它也会使您的搜索记录混乱

–詹姆斯
19年7月3日在18:38

是的,但我的假设(可能是错误的)是,由于您不再需要突出显示内容,因此您也不在乎该特定搜索。如果使搜索历史混乱,这是一个现实问题。

–科斯塔斯
19年7月3日在18:40



#7 楼

我将<Leader><Enter>用作:hls的快捷方式,并将我的领导者设置为空格。如果您决定要重新显示搜索结果,请点击<Space><Esc><Space><Esc>表示映射此键绑定以切换hls!的设置(hls的缩写,即搜索结果突出显示)(因此,hlsearch会在其之前切换设置)。

#8 楼

将此宏添加到您的.vimrc

map #h :set hls!<CR>


,这将允许您使用#h
切换高亮显示

评论


这与James Affleck的回答没有什么不同。

–詹姆斯
19年11月1日在22:49

我的似乎更简洁。

–李达瑞(Darrel Lee)
19年11月8日在19:46

为什么简明扼要?另一篇文章提供了有关命令各部分含义的更多信息,而本篇文章未提供其他内容。

–詹姆斯
19年11月8日19:53