我知道: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
答案 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的回答是正确的,除了几个问题。
@/
是禁用高亮显示现有搜索的重要方法解决方案是简化。不需要进行函数调用。
autocmd CursorHold,CursorHoldI * let v:hlsearch = 0 | redraw