如何编写一个vim函数来搜索多个字符串(当我调用一个函数时)并突出显示所有字符串(这样我就可以使用n/n来移动)



我想调用这个函数(使用映射(并高亮显示所有字符串,以便使用n/n进行导航。

这是我为这个函数编写的代码和映射,但无法使它工作。

function! FindAll(...)
let srchstr =  ""   
let list = split(a:000[0], ' ')
let lenth = len(list)
for item in list
let lenth = lenth - 1
if lenth != 0
let srchstr .= item."\|"
else
let srchstr .= item
endif
endfor
"echo srchstr
exec 'normal! /' . srchstr . "<CR>"
endfunction

然后我用这个映射称之为:

noremap <silent> ,fa  :call FindAll(input("Please Give Separate Strings :"))<CR>

这就是我调用它时给出输入字符串的方式

Please Give Separate Strings :One Two Three

我认为您正在与:help function-search-undo:作斗争

函数不会更改上次使用的搜索模式和重做命令"."。

这会使您的搜索命令在FindAll()函数中无效。

附加评论

  • input()将始终返回单个字符串;不需要对变量自变量CCD_ 4进行处理
  • 您的for循环可以替换为join()
  • 您可以不指定:normal! /,而只指定给@/,即最后一个搜索模式寄存器(:help quote/(
  • 您的映射不使用视觉选择或挂起运算符,因此最好只为正常模式定义它

修复

为了能够修改搜索模式,要么让函数返回它,要么(基于上面建议的简化(内联完成整个处理。现在它只是一个split-join的组合:

nnoremap <silent> ,fa :let @/ =
 join(split(input("Please Give Separate Strings :"), ' '), '<Bar>')<CR>

实际上,我们可以用正则表达式分支项|:交换每个空间字符

nnoremap <silent> ,fa :let @/ =
 substitute(input("Please Give Separate Strings :"), ' ', '\<Bar>', 'g')<CR>

最新更新