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

时间:2014-04-01 22:55:49

标签: vim vim-syntax-highlighting

我知道:nohl并且一直使用它,我也使用简单的动作,所以当移动到搜索位置时,突出显示不是我的方式。在按nN后,它会妨碍我。

我正在寻找一种方法来在3 secondsn 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

5 个答案:

答案 0 :(得分:6)

如果您检查:h :nohl,您会看到命令:nohl在autocmd中不起作用,原因是vim save&amp;恢复搜索&amp;执行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

答案 1 :(得分:2)

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

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

无论如何,你总是在逃避,所以当你想要清除hlsearch时,你可以毫不费力地打它。此外,如果您希望在正常模式下不打额外的话,可以选择突出显示比赛。

答案 2 :(得分:1)

以下内容将清除“更新时间”之后的搜索重点。毫秒不活动。 &#39;注册&#39;默认为4000毫秒或4秒,但我已将我的设置为10秒。重要的是要注意“更新时间”&#39;不仅仅是这样,所以在更改之前阅读文档。

function! SearchHlClear()
    let @/ = ''
endfunction
autocmd CursorHold,CursorHoldI * call SearchHlClear()

答案 3 :(得分:0)

有点神秘,但我希望它有用:

我调整了@ DhruvaSagar的答案,通过在不需要时停用autocmd来提高性能。我还删除了CursorHold事件:我喜欢平静地看待我的结果。

我与here的第二个回答一起使用此功能,在我搜索(通过/或{{}后,会在一段时间后自动停用突出显示1}})。

我的代码:

n

答案 4 :(得分:0)

Kevin Cox的回答是正确的,除了几个问题。

  1. 修改@/是禁用高亮显示现有搜索的重要方法
  2. Vim在调用函数之前/之后保存/恢复搜索突出显示状态,因此尝试在函数中更改它并非常有用。
  3. 解决方案是简化。不需要进行函数调用。

    autocmd CursorHold,CursorHoldI * let v:hlsearch = 0 | redraw