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

时间:2018-11-29 04:50:07

标签: vim

我想调用此函数(使用我的映射)并突出显示所有字符串,以便可以使用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

1 个答案:

答案 0 :(得分:2)

我认为您正在为:help function-search-undo而苦苦挣扎:

  

最后使用的搜索模式和重做命令“。”不会被该功能更改。

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

其他批评

  • input()将始终返回单个字符串;不需要处理变量参数(...)
  • 您的for循环可以替换为join()
  • 您可以将最后一个搜索模式寄存器(:help quote/)分配给:normal! /,而不是@/
  • 您的映射不使用视觉选择或未决运算符,因此最好将其定义为正常模式

修复

要能够修改搜索模式,可以使函数返回它,或者(根据上面建议的简化形式)内联进行整个处理。现在只是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>