2014-01-10 83 views
3

在vim中,我们可以用sub-replace-expression替代。当替代字符串以\=开头时,其余部分将被解释为一个表达式。替换表达式和匹配模式

例如文本:

bar 
bar 

和替代命令:

:%s/.*/\='foo \0'/ 

给出了意想不到的结果:

foo \0 
foo \0 

代替:

foo bar 
foo bar 

的问题是:如何评价EXPRES sion与匹配的模式替代?

回答

6

当您使用子取代表达,正常的特殊置换像&\1不工作了;一切都被解释为一个Vimscript表达式。幸运的是,您可以使用submatches()访问捕获的子匹配,因此它变为:

:%s/.*/\='foo ' . submatch(0)/ 
+0

太棒了!谢谢@Ingo Karkat! – hawk

0

你并不需要评估的任何表达,使用正则表达式组适当的逃逸

:%s /\(.*\)/foo \1/ 
+0

谢谢。但实际上我需要找出如何评估这是我的问题的主要目的。 – hawk

1

你需要:%s/.*/foo \0/

随着您评估​​3210 :%s/.*/\='foo \0'/但这是一个字符串,并将其评估自己。

+0

问题是如何评估表达式中的匹配模式不是正常的查找和替换。 – hawk

+0

显然,替换表达式的第二部分中的项目会自动评估。 – user2314737

+0

对我而言,它不会自动评估。我有Vim 7.3.1314。 – hawk