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)
如果检查: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)
恕我直言,一种更简单且更可预测的技术如下:
noremap <silent><esc> <esc>:noh<CR><esc>
无论如何,您总是会遇到逃逸,因此当您想清除 hlsearch 时,轻而易举地点击它。此外,您可以选择在正常模式下不点击额外内容来突出显示匹配项。