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

问题描述 投票:20回答:10

我想要的是映射一个键,例如F4,这样按F4将切换搜索高亮的可见性,因此无论当前可见性如何,开始新搜索都可以实现可见性。

我尝试过的:

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

似乎没有相反形式的: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

search vim highlighting highlight
10个回答
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切换高亮显示。只有怪癖是你必须在搜索之后按两次才能切换高亮显示,因为搜索不会增加计数器。


0
投票

为了实现这一点,我在.vimrc中添加了这条简单的行:

nmap <LEADER>h /xxxxx<CR>

14
投票

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

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

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

2
投票

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

其实你只需要

let @/ = ''

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

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

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

与vim玩得开心! :)


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>

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


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>

1
投票

你可以用:set invhlsearch切换


0
投票

嗯,是不是:set hlsearch:nohlsearch相反?

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

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

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

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


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
© www.soinside.com 2019 - 2024. All rights reserved.