VIM:超时后如何关闭搜索突出显示(X秒)

Dav*_*idG 5 vim vim-syntax-highlighting

我一直都知道:nohl并使用它,我也使用简单的动作,所以当移动到搜索位置时,突出显示不会影响我.按n或后它会挡住我的路N.

我正在寻找一种在3 seconds按下之后禁用搜索突出显示的方法,n或者N为了完整起见我想要一种方法也可以在搜索之后禁用它/search_word<CR>.

最后,它必须是一个非阻塞命令.

谢谢,我正在慢慢进入vimscript,但是这个已经超出了我的联盟,因为我还没有看到很多带有超时的命令示例.

编辑:

在一些评论和在线研究之后,有很多迹象表明使用vimscript做到这一点并不是一个好方法.

我正在寻找一种方法,以任何语言稳定地执行此操作,例如Perl,Python,Ruby.

编辑2:

这是我的解决方案,基于@ dhruva-sagar的回答:(我将他的答案标记为正确,因为他给了我骨架).

augroup NoHLSearch
  au!
  autocmd CursorHold,CursorMoved * call <SID>NoHLAfter(4)
augroup END

function! s:NoHLAfter(n)
  if !exists('g:nohl_starttime')
    let g:nohl_starttime = localtime()
  else
    if v:hlsearch && (localtime() - g:nohl_starttime) >= a:n
      :nohlsearch
      redraw
      unlet g:nohl_starttime
    endif
  endif
endfunction
Run Code Online (Sandbox Code Playgroud)

Dhr*_*gar 6

如果检查:h :nohl,您将看到该命令:nohl在autocmd中不起作用,原因是vim在执行autocmd后保存并恢复搜索和搜索突出显示状态.因此从技术上讲,这样做是不可行的.最好的方法是创建一个映射nnoremap <C-l> :nohlsearch<CR>,并在您想暂时禁用搜索突出显示时使用它.

然而,有一个轻微的黑客,我想证明它确实以你期望的方式工作set nohlsearch而不是nohlsearch,当然缺点是它完全关闭搜索突出显示你需要重新启用它set hlsearch,所以它不是一个真正的解决方案,但它是一个很好的例子来演示如何在vim中执行基于时间的操作.

注意:这更多用于教育目的,以演示如何在vim中执行基于时间的非阻塞任务.这些的性能可能会根据您在事件触发功能中执行的操作而有所不同.

augroup NoHLSearch
  au!

  autocmd CursorHold,CursorMoved * call <SID>NoHLAfter(3)
augroup END

function! s:NoHLAfter(n)
  if !exists('g:nohl_starttime')
    let g:nohl_starttime = localtime()
  else
    if v:hlsearch && (localtime() - g:nohl_starttime) >= a:n
      set nohlsearch
      unlet g:nohl_starttime
    endif
  endif
endfunction
Run Code Online (Sandbox Code Playgroud)


cpt*_*g06 5

恕我直言,一种更简单且更可预测的技术如下:

noremap <silent><esc> <esc>:noh<CR><esc>

无论如何,您总是会遇到逃逸,因此当您想清除 hlsearch 时,轻而易举地点击它。此外,您可以选择在正常模式下不点击额外内容来突出显示匹配项。