我想处理一组行并将模板应用于每一行。假设我有以下几行:
CASE
ESAC
IF
FI
我想得到以下输出:
<YYINITIAL> {CASE} {
return new Symbol(sym.CASE);
}
...
<YYINITIAL> {FI} {
return new Symbol(sym.FI);
}
所以,我想到了一个带有正文的模板来申请每一行,如下所示:
<YYINITIAL> {###PLACE_HOLDER###} {
return new Symbol(sym.###PLACE_HOLDER###);
}
并将其应用于每一行。
我想到的是选择行,然后放入寄存器(例如“a”),然后选择将其放入寄存器(“b)的模板,并调用生成输出的外部脚本。但是没有运气(不知道如何将寄存器的内容传递给外部脚本)。
欢迎任何其他方法。
答案 0 :(得分:2)
这个命令可以完成这个任务:
:%s/.*/<YYINITIAL> {&} {\r\treturn new Symbol(sym.&);\r}/
如果您选择了可视线,则可以删除%
。如果经常使用它,你也可以为它创建一个映射或用户命令。
答案 1 :(得分:1)
您建议的方法似乎过于复杂,尤其是因为您仍然需要将模板扩展逻辑实现为外部脚本。
为什么不简单地将模板定义为:substitute
命令?!您可以通过PLACEHOLDER
与/\({pattern}\)/
进行模式匹配,然后将其插入替换文本中\1
,\2
等。(我希望您了解Vim的强大功能{ {1}}命令;否则,请阅读:substitute
。
您可以通过多种方式保留和保留模板,具体取决于您需要的频率/长度:
:help :s
):s<Up>
)中,使用:let @a = @:
:@a
:source
s