如何切换Vim的搜索突出显示可见性而不禁用它

时间:2012-01-29 16:42:06

标签: search vim highlighting highlight

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

我尝试了什么:

  1. F4 映射到:nohlsearch暂时禁用高亮显示,而不关闭hlsearch设置,但它不会再次切换可见性。
  2. F4 映射到:set hlsearch!会打开/关闭,但我不想切换hlsearch设置,只关闭可见性设置。如果hlsearch已关闭,则无法通过新搜索自动返回。
  3. 似乎没有:nohlsearch的相反形式,并且命令本身在从函数调用时存在问题。

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

    更新
    第一条评论提供了我要求的内容,转载如下:

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

    (N.B。对于任何使用此项目的人来说 - 将地图填充到一行而不是使用函数是必要的,因为您无法对函数内部的突出显示进行更改。)

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

11 个答案:

答案 0 :(得分:14)

注意,最近的Vims(7.4.79)有v:hlsearch变量可用。这意味着您可以将映射改进为:

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

答案 1 :(得分:13)

" 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切换高亮显示。只有怪癖你才能在搜索之后按两次以关闭高亮显示,因为搜索不会增加计数器。

答案 2 :(得分: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>/

答案 3 :(得分:2)

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

其实你只需要

let @/ = ''

我写了一个小函数来实现这个功能,并突出显示当前单词(就像*星号键),但不跳转到下一个匹配的单词,而不是触摸跳转列表。

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

这很简单,但我不是在谷歌中找到它。

与vim玩得开心! :)

答案 4 :(得分:1)

好的,试试这个:

: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>

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

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

: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<CR>时可以记下的原始值。这样它可以关闭然后重新打开,但有两个键盘快捷键。如果你想要一个,你应该为切换它的函数创建一个函数,然后为该函数创建一个映射。

答案 5 :(得分:1)

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>

答案 6 :(得分:0)

嗯,:set hlsearch:nohlsearch相反?

第一个转动匹配突出显示,第二个转动匹配突出显示temporarilly。

我不明白你的意思“我不想切换'hlsearch'设置本身,只是切换可见性设置。”::set hlsearch及其吊坠仅处理可见性(“突出显示” “)搜索匹配,没有别的。

如果您希望每次搜索都突出显示匹配项,只需将:set hlsearch添加到~/.vimrc即可。

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

答案 7 :(得分:0)

我使用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 :(得分:0)

您可以使用:set invhlsearch

进行切换

答案 9 :(得分:0)

为了完成此任务,我在.vimrc中添加了这条简单的行:

nmap <LEADER>h /xxxxx<CR>

答案 10 :(得分:0)

我使用以下内容:

augroup onsearch                                                                                                                    
    autocmd!                                                                                                                          
    autocmd VimEnter * set hlsearch                                                                                                   
augroup END

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

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