我注意到当我使用:nohlsearch时,它实际上并没有执行与:set nohlsearch相同的操作。

特别地,实际上并未关闭hlsearch设置(这是:set hlsearch所完成的)。

演示我的意思:

:set hlsearch
:nohlsearch
:echo &hlsearch


此打印1(hlsearch仍然设置!)

:set hlsearch
:set nohlsearch
:echo &hlsearch


这样会打印出0,因为我们使用了标准方法关闭了hlsearch,从而关闭了vim中的设置。

所以我有点纳闷,因为必须有一些实际的:nohlsearch ex命令存在的原因。

我关心的原因是,我现在需要在vim脚本中测试搜索突出显示是否处于活动状态,并且由于我在其他脚本中使用:nohlsearch而不是“:set nohlsearch” ,我的&hlsearch测试始终返回1。因此,我想知道不再通过使用nohlsearch ex命令来更改什么。

#1 楼

来自:h :nohlsearch

                                                        :noh :nohlsearch
:noh[lsearch]           Stop the highlighting for the 'hlsearch' option.  It
                        is automatically turned back on when using a search
                        command, or setting the 'hlsearch' option.
                        This command doesn't work in an autocommand, because
                        the highlighting state is saved and restored when
                        executing autocommands autocmd-searchpat.
                        Same thing for when invoking a user function.


关键是,当您开始新的搜索时,它将自动重新打开突出显示。 :set nohlsearch实际上关闭了hlsearch,这意味着下次搜索没有突出显示的内容。

示例:假设hlsearch已打开,如果当前正在缓冲区中搜索“ hello”,则所有“ hello” “将突出显示。如果使用:nohlsearch,则不会突出显示任何内容。但是,如果您随后搜索“世界”,则所有“世界”都将突出显示。如果使用的是set nohlsearch,则“ world”将不会突出显示。


还要注意,该命令在用户功能内基本不执行任何操作。例如,

function! NoHlsearch()
    nohlsearch
endfunction


运行时没有可见的效果。


要查看hlsearch是否实际上是活动的,您要检查变量v:hlsearch。当v:hlsearch = 0高亮显示关闭时,以及v:hlsearch = 1高亮显示打开时。在检查&hlsearch = 1之前,您可能应该先确定v:hlsearch

:h v:hlsearch开始

                                        v:hlsearch hlsearch-variable
v:hlsearch      Variable that determines whether search highlighting is on.
                Makes sense only if 'hlsearch' is enabled which requires
                +extra_search. Setting this variable to zero acts the like
                :nohlsearch command, setting it to one acts like
                        let &hlsearch = &hlsearch


评论


您能否从函数内部阐明“基本没有”的含义?它确实执行标准操作(它暂时停止突出显示搜索,直到下次调用搜索为止)。

–陆even
2015年5月2日,0:33

我也希望找到一种方法来访问用于控制瞬态:nohlsearch是否有效的标志...我想在没有它的情况下,我必须诉诸于使用变量来跟踪所有:nohlsearch调用。

–陆even
2015年5月2日,0:37

@StevenLu参见编辑。

–FDinoff
2015年5月2日,0:41

谢谢。看起来我一直在通过以下方式来解决“基本无所作为”方面的代码:nnoremap SearchHighlight(),其中SearchHighlight()可能返回字符串“:silent nohlsearch \ < CR>”。也感谢您的v:hlsearch提示,正是我所需要的。

–陆even
2015年5月2日,0:46



#2 楼

您的脚本是否要求知道突出显示的当前状态?

仅在当前搜索中关闭hlsearch,我在我的.vimrc中使用Ctrl-l

nnoremap <silent> <C-l> :<C-u>nohlsearch<CR><C-l>


使用上述命令时,搜索突出显示将返回下一次搜索。 Ctrl-l很方便,因为它的正常用法是清除并重新绘制屏幕。

要永久性地打开或关闭搜索突出显示状态,我将F3用作切换开关:

nnoremap <F3> :set hlsearch! hlsearch?<CR>