:)
我喜欢在 Vim 中使用搜索突出显示。但过了一段时间它很糟糕,我手动删除它(定义映射)。所以我写了一个函数,在一段时间后删除突出显示,限制为自动命令。如果你只是主演搜索结果,时间可能会成为问题,我将此函数绑定到echo
事件并引入计数器直到零。如果我在结果之间跳转或决定稍后跳转到搜索结果元素,这可以正常工作,所有结果再次突出显示(手动测试)。
我插入了很多echo
条消息来跟踪行为。它完全没问题,直到柜台到期" (得到零)。然后应该删除突出显示和计数器。两者都作为echom v:hlsearch
输出声明,但不是视觉上的。在.vimrc
批准的未设置突出显示后进行检查,确认它已经有效,但之后再次突出显示(延迟不可见)。所以循环再次开始,因为计数器已过期,但是" new"检测到突出显示。
调用与函数中相同的命令可以完成。那会发生什么?
所以这是" Function used if something is highlighted in the document.
" Is meant to be called several times by a autocommand.
" Sets a counter on the first call.
" Afterwards it decrease the counter each time get called, until zero.
" When the highlighting will be removed and the counter also.
" By this the time until remove highlighting depends on the frequency of
" function calls and that depend on the bounded auto command.
"
function! s:remove_highlight()
echom 'Call'
" Only makes sense when something is highlighted.
if v:hlsearch
echom 'In'
" First call, so set the start time
if !exists('g:highlight_counter')
echom 'first call after new highlighting'
let g:highlight_counter = 4
else
" Decrease highlight counter.
let g:highlight_counter = g:highlight_counter - 1
echom 'check ' . g:highlight_counter
" Check if the counter is expired.
if g:highlight_counter <= 0
" Unset counter and remove highlight.
unlet g:highlight_counter
execute 'nohlsearch'
echom 'done? ' . !v:hlsearch
else
endif
endif
echom 'out'
endif
echom 'End'
endfunction
中的代码:
{{1}}
这里发生了什么想法?我不知道......
答案 0 :(得分:2)
首先,:nohlsearch
是一个ex命令,因此您不需要:execute
。
其次,:help :nohlsearch
说:
此命令在自动命令中不起作用,因为在执行自动命令| autocmd-searchpat |时会保存并恢复突出显示状态。 调用用户函数时也是如此。
所以......你不能在一个函数中使用它。
搜索后禁用搜索突出显示不是微不足道的。如果您想了解实际的实际情况,我建议您查看the code of vim-cool。
答案 1 :(得分:2)
从函数内部尝试以下操作:
call feedkeys( ":nohlsearch\<CR>" )
注意:请注意双引号,转义序列需要使用双引号。即使从函数内部(经过vim 8测试),这也对我有效。我不是vimscript专家,但是这里可能发生的事情是,它将密钥添加到队列中并仅在函数完成后对其进行处理。