VIM检查vim脚本中的搜索模式匹配

时间:2016-10-08 08:22:55

标签: vim

我刚开始使用vim脚本并尝试更轻松地翻译opencart语言文件。我想要一个查找给定搜索模式并选择它的函数。如果文件中没有剩余匹配项,则应打开下一个文件进行编辑。到目前为止我所拥有的:

function! Nextmatch()
    normal /\(= *'\)\@<=.\{-\}\('\)\@=/
    normal v//e
endfunction

function! Nextfile()
   if !exists("s:filecounter")
        execute "!find -iname *.php > files.txt"
        normal <CR>
        let s:filecounter=0
   endif
   let s:lines= system("wc -l < files.txt")
   if s:filecounter<s:lines
        w
        let s:filecounter += 1
        let s:sedcommand="sed '".s:filecounter."!d' files.txt"
        let s:selectedfile=system(s:sedcommand)
        execute 'edit' s:selectedfile
   else
        wq
   endif
endfunction

如果在游标和当前文件末尾之间找不到搜索模式,我怎样才能在Nextfile()中调用Nextmatch()?你的片段中有哪些你认为不好的风格?

2 个答案:

答案 0 :(得分:1)

您只需使用:vim命令即可​​删除所有脚本。

我认为以下内容应该符合您的期望:

:noremap <f8> <esc>:cn<cr>gn
/\(= *'\)\@<=.\{-\}\('\)\@=
:vim //g *.php

然后,在选择它时转到所有文件中的下一个模式, 你只需要按F8键。

noremap行,gn可让您选择下一个实际搜索。

您可能需要这样做:

:set nohidden

让你导航修改缓冲区(但不要忘记保存 他们使用:wa,或将其列为:ls

关于你的剧本:

  • 脚本中习惯使用:normal!代替:normal(除非您故意需要它),这是一个好习惯:因此,您的个人映射不会干扰您的脚本。

答案 1 :(得分:1)

Quickfix命令功能强大且与某些外部插件完美集成,但如果您确实需要使用自己的脚本,并且需要在if语句中检查匹配项,请执行以下操作:

if search("=\\s*'\\zs[^']*\\ze", 'W') == 0
     echo 'No match until the end of the buffer'
endif

请参阅:h search(),请注意:

    由于双引号,
  • 双反斜杠
  • 禁止在文件末尾包装的'W'标志
  • 我简化了你提供的模式