Vim执行Nohlsearch不起作用

时间:2018-05-08 13:02:50

标签: vim

:)
我喜欢在 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}}

这里发生了什么想法?我不知道......

2 个答案:

答案 0 :(得分:2)

首先,:nohlsearch是一个ex命令,因此您不需要:execute

其次,:help :nohlsearch说:

  

此命令在自动命令中不起作用,因为在执行自动命令| autocmd-searchpat |时会保存并恢复突出显示状态。 调用用户函数时也是如此。

所以......你不能在一个函数中使用它。

搜索后禁用搜索突出显示是微不足道的。如果您想了解实际的实际情况,我建议您查看the code of vim-cool

答案 1 :(得分:2)

从函数内部尝试以下操作:

call feedkeys( ":nohlsearch\<CR>" )

注意:请注意双引号,转义序列需要使用双引号。即使从函数内部(经过vim 8测试),这也对我有效。我不是vimscript专家,但是这里可能发生的事情是,它将密钥添加到队列中并仅在函数完成后对其进行处理。