如何切换 Vim 的搜索高亮可见性而不禁用它

Posted

技术标签:

【中文标题】如何切换 Vim 的搜索高亮可见性而不禁用它【英文标题】:How to toggle Vim's search highlight visibility without disabling it 【发布时间】:2012-02-21 17:03:06 【问题描述】:

我想要的是映射一个键,例如F4,因此按下 F4 将切换搜索突出显示的可见性, 以便无论当前可见性如何,开始新搜索都会启用可见性。

我尝试过的:

    F4 映射到 :nohlsearch 会暂时禁用突出显示可见性而不关闭 hlsearch 设置,但它不会再次切换回可见性。 将 F4 映射到 :set hlsearch! 确实会打开/关闭,但我不想关闭 hlsearch 设置,只是可见性设置。如果hlsearch 已关闭,则它不会自动返回新的搜索。

:nohlsearch 似乎没有相反的形式,并且命令本身在从函数调用时存在问题。

我发现了类似的问题,但没有提供答案。

更新: 第一条评论正是我所要求的,转载如下:

let hlstate=0
nnoremap <F4> :if (hlstate == 0) \| nohlsearch \| else \| set hlsearch \| endif \| let hlstate=1-hlstate<cr>

(请注意,对于使用此功能的任何人 --- 将地图塞进一行而不是使用函数是必要的,因为您无法从函数内部对突出显示进行更改。)

功能略有不同的相关问题:https://***.com/a/16750393/1176650

【问题讨论】:

这是答案:第 1 行:" ctrl+c to toggle highlight.,第 2 行:let hlstate=0。第 3 行:nnoremap &lt;c-c&gt; :if (hlstate%2 == 0) \| nohlsearch \| else \| set hlsearch \| endif \| let hlstate=hlstate+1&lt;cr&gt;。现在只需按 ctrl+c 即可切换高亮显示。 太棒了!如果您将评论重新发布为答案,我会接受。据我所知,这个问题不再被标记为重复。 好的,就是这样。 :) 感谢您的启发。您可能希望在 nnoremap 和 之间添加 ,以防止乱扔状态行。 我花了一段时间才注意到 hlsearch 在功能中不起作用。知道为什么吗? 【参考方案1】:

我使用以下:

augroup onsearch                                                                                                                    
    autocmd!                                                                                                                          
    autocmd VimEnter * set hlsearch                                                                                                   
augroup END

nnoremap <leader>/ :set hlsearch!<CR>

自动组确保在进入 vim 时启用突出显示,但在重新获取 vimrc 文件时未打开。映射将其打开和关闭。

【讨论】:

【参考方案2】:

为了做到这一点,我在我的 .vimrc 中添加了这个简单的行:

nmap <LEADER>h /xxxxx<CR>

【讨论】:

【参考方案3】:

你可以用:set invhlsearch切换

【讨论】:

【参考方案4】:

注意,最近的 Vim (7.4.79) 提供了 v:hlsearch 变量。这意味着您可以将映射改进为:

:nnoremap <silent><expr> <Leader>h (&hls && v:hlsearch ? ':nohls' : ':set hls')."\n"

【讨论】:

这是最好的选择,因为像/?nN 等任何搜索操作都会重新启用突出显示,并且不需要重新映射任何他们。 如何映射ctrl-l而不失原有功能? @SergioAraujo 使用:redraw 命令并附加hls 命令。 你的命令和这个有什么不同? nmap &lt;F4&gt; :let &amp;hls=(&amp;hls == 1 ? 0 : 1)&lt;cr&gt; 因为这个没有使用`v:hlsearch`,也没有使用&lt;expr&gt;。如果可能的话,我想包含一个redraw,因为我想使用&lt;ctrl-l&gt;,它比&lt;leader&gt;h更快地按下它。 @SergioAraujo v:hlsearch 给出正确的状态,无论匹配是否突出显示,hls 没有,它只是启用此选项,但由于:nohls,它仍然可能被禁用。 【参考方案5】:

其他答案需要切换高亮搜索,这不太好。

其实你只需要

let @/ = ''

我写了一个小函数来实现这个功能,高亮当前单词(就像*星键一样),但不跳转到下一个匹配的单词,也不触摸跳转列表。

function! HLtoggle()
    if (@/ == '')
        let @/ = expand("<cword>")
    else
        let @/ = ''
    endif
endfunc

这很简单,但我在 google 上找不到。

玩得开心! :)

【讨论】:

【参考方案6】:

从Highlight all search pattern matches,我们可以映射一个键来切换高亮状态。与 trusktr 的回答不同,这里我们确实使用变量来存储状态。

“如果您希望能够快速启用/禁用突出显示,您可以映射一个键来切换 hlsearch 选项”:

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

“或者,按回车键暂时退出突出显示的搜索”:

:nnoremap <CR> :nohlsearch<CR><CR>

【讨论】:

【参考方案7】:

我使用 trusktr 的这个稍微改进的版本。请注意,在 trusktr 的示例中使用的 ctrl+c 默认已经映射到 Escape,这非常方便。

" Toggle highlight search
let hlstate=0
nnomap <Leader>b :if (hlstate%2 == 0) \| nohlsearch \| else \| set hlsearch \| endif \| let hlstate=hlstate+1<CR>:echo "toggled visibility for hlsearch"<CR>
inomap <Leader>b <ESC>:if (hlstate%2 == 0) \| nohlsearch \| else \| set hlsearch \| endif \| let hlstate=hlstate+1<CR>:echo "toggled visibility for hlsearch"<CR>a

【讨论】:

【参考方案8】:
" ctrl+c to toggle highlight.
let hlstate=0
nnoremap <c-c> :if (hlstate%2 == 0) \| nohlsearch \| else \| set hlsearch \| endif \| let hlstate=hlstate+1<cr>

现在只需按 ctrl+c 即可切换高亮显示。唯一的怪癖是您必须在搜索后按两次以关闭突出显示,因为搜索不会增加计数器。

【讨论】:

我已链接到另一个 SO 问题,该问题显示了如何进行更好的切换。然而,当自动启用高亮时,它需要接受不同的功能:在其中,只有搜索会自动启用高亮,而不是替代(这是该方法的限制)。但我认为我实际上更喜欢这样。 酷,谢谢分享!通过一些努力,也许可以做出第三种解决方案。 :D【参考方案9】:

我想要的是映射一个键,例如F4,这样按 F4 就会 切换搜索亮点的可见性,以便开始一个新的 无论当前可见性如何,搜索都会启用可见性。

刚刚尝试过,似乎成功了:

" switch higlight no matter the previous state
nmap <F4> :set hls! <cr>
" hit '/' highlights then enter search mode
nnoremap / :set hlsearch<cr>/

【讨论】:

【参考方案10】:

好的,试试这个:

:map <F12> :set nohls<CR>:let @/ = ""<CR>:set hls<CR>

然后如果你点击F12,它会关闭高亮显示,然后将最后一个搜索字符串设置为空(即:清除它),然后返回高亮显示。

或者如果你想保存搜索字符串,那么你可以这样做:

:map <F12> :set nohls<CR>:let @s = @/<CR>:let @/ = ""<CR>:set hls<CR>
:map <SHIFT><F12> :let @/=@s<CR>

现在按下 SHIFTF12 后,原始搜索字符串将被设置回并突出显示。

如果仍然不能满足你,你仍然可以这样做:

:map <F12> :highlight Search term=None ctermfg=None ctermbg=None guifg=None guibg=None<CR>
:map <SHIFT><F12> :highlight Search term=OV1 ctermfg=OV2 ctermbg=OV3 guifg=OV4 guibg=OV5<CR>

其中OVx 是您在发出:highlight Search&lt;CR&gt; 时可以写下的原始值。这样它可以关闭然后重新打开,但有两个键盘快捷键。如果你想要它,你应该为它创建一个切换它的函数,然后为该函数创建一个映射。

【讨论】:

这实际上与尝试 1) 相同,因为它会很好地关闭突出显示并确保它很好地返回到我的下一次搜索中。问题是,如果没有下一次搜索,我希望按钮关闭并打开上一次搜索的突出显示,因此我们无法清除@/ 变量。 查看我的更新答案,设置它,和/或使用highlight 命令。 @Ein 解决方案很简单(也许它在 2012 年 1 月的 vim 中不起作用)但是要“隐藏”突出显示,请执行 :nohl,并“取消隐藏”突出显示,只需做:set hls。您的搜索词将一直被记住。只需根据 2 修改的变量计数器创建一个执行任一命令的映射。【参考方案11】:

嗯,:set hlsearch 不是 :nohlsearch 的反义词吗?

第一个打开匹配突出显示,第二个暂时关闭匹配突出显示。

我不明白您所说的“我不想切换 'hlsearch' 设置本身,只是切换可见性设置。”::set hlsearch 及其挂件仅处理可见性(“突出显示”)搜索匹配,仅此而已。

如果您想在每次搜索时突出显示匹配项,只需将 :set hlsearch 添加到您的 ~/.vimrc

如果您想在搜索后关闭突出显示功能,只需将 F4 映射到 :nohlsearch,突出显示将在您下次搜索时返回。

【讨论】:

要回答您的问题,请在 vim 中尝试:set hlsearch?要验证它是否打开,执行搜索,执行 :nohlsearch (如果有的话,它会关闭可见性),然后执行 :set hlsearch?再次。这将表明 hlsearch 仍在运行。重要的是,如果您执行第二次搜索,那么突出显示的可见性将会回来。相反,如果您执行 :set nohlsearch,那么在您撤消设置之前,可见性将永远不会恢复。 关于最后一句话,将 F4 映射到 :nohlsearch 只能让我关闭高亮显示。我希望能够打开和关闭相同的搜索让它在我的下一次搜索时总是回来。 这就是:nohlsearch 的意义所在:它是暂时的。突出显示将在您下次搜索时返回,这不是您想要的吗? 是和不是。我想暂时关闭它,是的。但我不希望那个临时时间是“直到我下次执行新搜索”。相反,我希望它暂时关闭“直到我下次按 F4 执行新搜索” 我也想切换它,而不必重新搜索。

以上是关于如何切换 Vim 的搜索高亮可见性而不禁用它的主要内容,如果未能解决你的问题,请参考以下文章

Chrome 扩展:如何禁用页面可见性 API

如何使用按钮单击来切换 div 的可见性

如何切换 WPF Grid 列的可见性

折叠可见性时如何禁用对组合框元素的验证?

如何在 BIRT 中禁用或启用图表可见性

Silverlight 4:如何切换控件可见性