【问题标题】:How to prevent search highlight during when executing a mapping如何在执行映射时防止搜索突出显示
【发布时间】:2019-06-18 22:28:04
【问题描述】:

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

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

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

【问题讨论】:

  • 另一种映射nnoremap &lt;leader&gt;= :t.&lt;cr&gt;v$r=

标签: vim neovim


【解决方案1】:

一般解决方案

我会使用: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=

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

【讨论】:

  • v_r 很酷。这也可以用来给缩进的行加下划线:nnoremap &lt;leader&gt;= yypv$=。只是省略了 0。
  • :keeppat怎么样
【解决方案2】:

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

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>

【讨论】:

    【解决方案3】:

    在研究 :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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 2017-03-10
      • 2021-04-13
      • 1970-01-01
      • 2011-07-22
      相关资源
      最近更新 更多