2012-01-27 61 views
1

我想制定一个正则表达式,匹配一组文件的名称,我想在Vim中批处理,但我发现我似乎无法使用\如预期(正则表达式OR)...Vim正则表达式或在Windows上的文件名模式

具体来说,我想创建一个包含在当前目录下文件的参数列表:

f0148.e, f0149.e, f0150.e ... f0159.e (i.e., 12 files total) 

我输入的Vim命令去如下:

:arg f01\(\(4[89]\)\|\(5[0-9]\)\).e 

Vim完成此命令时没有任何明显的结果 - 没有消息,输出:args保持不变(不会生成所需的文件名列表)。

如果我分手了正则表达式: :arg f01\(\(4[89]\)\).e(注:这里留下括号在上面充分体现)
......还有......

:arg f01\(\(5[0-9]\)\).e 

...然后:args产生f0148.e f0149.ef0150.e ... f0159.e(根据需要)。另外,如果我在文本文件中输入上述文件名列表并且使用上述正则表达式作为搜索模式(即,/f01\(\(4[89]\)\|\(5[0-9]\)\).e),它就按照需要工作。

因此,我确定交替(\|)在某种程度上导致表达失败。请注意,我在Windows 7上使用Vim,如果这是相关的(因为反斜杠和管道在Windows命令提示符下都是有效的符号)。

一个快速的解决方法是使用:

:arg f014[89].e 
:argadd f015[0-9].e 

...但我真的想弄清楚如何使上述正则表达式的工作。

感谢您的帮助!

+0

请阅读[如何在Stack Exchange网站上发布代码片段](http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks)。简而言之:突出显示并按下CTRL-K。 – Benoit 2012-01-27 12:30:17

+0

感谢您指出 - 而且这么快! – Mesagoma 2012-01-27 13:56:00

回答

2

我可以建议:

:let file_list = filter(split(globpath('.','**'),nr2char(10)), 'v:val =~ ''f01\(\(4[89]\)\|\(5[0-9]\)\)\.e'' ') 
:execute 'args ' . join(map(file_list,'fnameescape(v:val)'),' ') 

这是如何工作:

  • globpath('.','**')使得在当前目录下的所有文件和所有子目录的列表。 :help globpath()
  • split(..., nr2char(10))将列出它,因为分隔符是换行
  • filter(..., 'v:val =~ ''pattern'' ')过滤列表只保留项目匹配模式。 :help v:val。将单引号加倍会在单引号字符串内转义它们。
  • map(..., fnameescape())逃脱所有的空格和反斜杠
  • join()增加了文件名之间的空格

如果你想它,你可以把这个变成你的vimrc功能:

function! ArgsPattern(pat) 
    let file_list = filter(split(globpath('.','**'),nr2char(10)), 'v:val =~ ''' . substitute(a:pat,"'","''",'g') . '''') 
    execute 'args ' . join(map(file_list,'fnameescape(v:val)'),' ') 
endfunction 
command! -nargs=+ ArgsPattern call ArgsPattern(<q-args>) 

然后你只需要做:

:ArgsPattern f01\(\(4[89]\)\|\(5[0-9]\)\)\.e 

不是e如果没有匹配,则函数内的execute命令评估为:args,因此将打印当前参数的列表。

+0

有一个小小的语法错误 - 'file_list'应该是'aaa'(反之亦然),否则这个工作。这比我所寻找的要复杂一点,但我很欣赏这个建议和彻底的解释!这可能会在未来的其他事情中派上用场。 – Mesagoma 2012-01-27 13:53:34

+0

@Mesagoma:感谢您的反馈,您可以建议编辑。 – Benoit 2012-01-27 13:55:41

+0

我会尽量记住下一次建议编辑。感谢这个功能,唉,它看起来并没有像你发布的命令一样 - 它也进入了子文件夹。另外,能够在正则表达式中包含路径会更好...... 但是,这种方式会走向错误的方向:**我真正需要的**是让原始规则表达式使用'arg'命令(可能通过以不同的方式转义正则表达式?)或学习_why_'\ |'在这种情况下不能使用。 – Mesagoma 2012-01-29 10:50:37