在执行映射时如何防止搜索突出显示

时间:2019-01-25 05:16:31

标签: vim neovim

nvim中编写映射时,有时会使用搜索/替换,例如在此映射中创建与当前行长度相同的标题(用于markdown等):

nnoremap <leader>= 0Vyp0v$:s/./=/g<cr>:nohls<cr>

虽然用:nohls清除了搜索突出显示的内容,但仍会创建搜索/替换的“闪光”。

3 个答案:

答案 0 :(得分:2)

一般解决方案

我将使用:help function-search-undo并将命令提取到:function中。这不会破坏当前的搜索模式,因此也不会影响搜索突出显示。要完全保持中立,只需从搜索历史中删除使用的替换模式(通过histdel()):

function! MakeHeading()
    normal! Vyp
    s/./=/g
    call histdel('search', -1)
endfunction
nnoremap <leader>= :call MakeHeading()<CR>

请注意,我还简化了视觉选择处理:由于V总是选择整行,因此您无需转到第一列(^),重新选择也无需必要;我们可以让:substitute在当前(粘贴)行上工作。

替代实现

这使我想起该功能的规范实现使用了:help v_r命令,这确实需要重新选择:

nnoremap <leader>= Vyp0v$r=

由于这里不涉及任何模式,因此搜索突出显示完全不受它影响:-)

答案 1 :(得分:1)

根据您自己的答案,我将提出以下建议:

nnoremap <leader>= :set nohlsearch<cr>0Vyp0v$:s/./=/g<cr>:let @/=''<cr>:set hlsearch<cr>

这只是将搜索寄存器设置为空字符串。所以没有突出显示。您甚至可以将其重置为上一个搜索字符串:

nnoremap <leader>= :let olds=@/<cr>0Vyp0v$:s/./=/g<cr>:let @/=olds<cr>

顺便说一句:yyp:s/./=/g不会更容易。


我个人默认关闭hlsearch,仅在需要时才将其打开。要进行切换,我的vimrc中具有以下映射:

" Switch on/off higlighting of search string
noremap  <F8>   :set invhlsearch hlsearch?<CR>

答案 2 :(得分:0)

在研究:h :s和:h s_flags`的同时,更多地环顾here的同时,@ Ein的答案中的一部分仍然对我:

  

每当您运行命令:set hlsearch时,都会产生两个效果:它会设置选项,并且让vim忘记是否曾经键入过:nohlsearch。换句话说,更改'hlsearch'(打开或关闭)将强制当前"highlight visibility"进行逻辑匹配。

结合使用:set nohlse标志(:h s_e),我最终得到:

nnoremap <leader>= :set nohlsearch<cr>0Vyp0v$:s/./=/g<cr>:s/thanks@Ein//e<cr>:set hlsearch<cr>

" Broken out
" Turn off highlighting
:set nohlsearch

" Yank the whole line, duplicate it, and replace `.` with `=`
0Vyp0v$:s/./=/g

" Do a replace with something I'll never find in a document (probably), with `/e` to suppress errors.
:s/thanks@Ein//e

" Finally, reenable highlighting
:set hlsearch

欢迎使用任何更优雅的解决方案。我想至少会尽快将其中的一些重构为函数,以允许将诸如-之类的其他字符用作副标题。