我什么时候不知道,但是我的视觉选择搜索功能不再起作用。我将问题分解为这个最小的例子。
假定以下缓冲区:
word
word
word
运行/word
时,我会找到所有结果,并且可以在它们之间跳转。
当我运行:execute '/word'
时,其工作原理与以前相同。
当我写一个简短的自动加载函数只是做同样的事情时,它的工作原理是不同的:
~/.config/nvim/autoload/utils/search.vim
:
function! utils#search#visual_selection() abort
execute '/word'
endfunction
执行:call utils#search#visual_selection()
可使光标停留在第一个结果上,但不会突出显示结果。而且,它正在使用旧的搜索模式而不是新的搜索模式。因此,如果我先搜索foo
这样不存在的东西,然后执行此功能,请按n
,给我错误消息Pattern not found: foo
。
发生了什么变化。这里有什么区别?
答案 0 :(得分:1)
这实际上是Vim和NeoVim记录的行为。它与:execute
的使用并没有真正的关系(您可以直接使用/word
来重现它),而是与函数中搜索(和重做)的工作方式有关。
请参见:help function-search-undo
,其中指出:
该功能不会更改上次使用的搜索模式和重做命令“
.
”。这也意味着当函数返回时,:nohlsearch
的作用将被撤消。
您可以通过显式设置search pattern register来解决此问题,这可以使用let
命令来完成。
function! utils#search#visual_selection()
let @/ = 'word'
execute "normal /\<cr>"
endfunction
第二个命令从普通模式执行一个简单的/
,足以搜索单词,因为它将查找最后设置为您想要的搜索模式。
函数完成后,搜索模式将保留其值,这意味着通过'hlsearch'
突出显示将起作用,而n
命令也将查找下一个匹配项。