在nvim
中编写映射时,有时会使用搜索/替换,例如在此映射中创建与当前行长度相同的标题(用于markdown等):
nnoremap <leader>= 0Vyp0v$:s/./=/g<cr>:nohls<cr>
虽然用:nohls
清除了搜索突出显示的内容,但仍会创建搜索/替换的“闪光”。
答案 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 nohls
和e
标志(: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
欢迎使用任何更优雅的解决方案。我想至少会尽快将其中的一些重构为函数,以允许将诸如-
之类的其他字符用作副标题。