VimScript执行搜索不再起作用

时间:2019-06-06 10:35:13

标签: vim neovim

我什么时候不知道,但是我的视觉选择搜索功能不再起作用。我将问题分解为这个最小的例子。

假定以下缓冲区:

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

发生了什么变化。这里有什么区别?

1 个答案:

答案 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命令也将查找下一个匹配项。