将一组线应用于模板

时间:2013-03-04 12:35:14

标签: vim

我想处理一组行并将模板应用于每一行。假设我有以下几行:

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)的模板,并调用生成输出的外部脚本。但是没有运气(不知道如何将寄存器的内容传递给外部脚本)。

欢迎任何其他方法。

2 个答案:

答案 0 :(得分:2)

这个命令可以完成这个任务:

:%s/.*/<YYINITIAL> {&} {\r\treturn new Symbol(sym.&);\r}/

如果您选择了可视线,则可以删除%。如果经常使用它,你也可以为它创建一个映射或用户命令。

答案 1 :(得分:1)

您建议的方法似乎过于复杂,尤其是因为您仍然需要将模板扩展逻辑实现为外部脚本。

为什么不简单地将模板定义为:substitute命令?!您可以通过PLACEHOLDER/\({pattern}\)/进行模式匹配,然后将其插入替换文本中\1\2等。(我希望您了解Vim的强大功能{ {1}}命令;否则,请阅读:substitute

您可以通过多种方式保留和保留模板,具体取决于您需要的频率/长度:

  1. 仅在命令行历史记录(:help :s
  2. 保存在命名寄存器(:s<Up>)中,使用:let @a = @:
  3. 执行
  4. 保存在Vim脚本中,然后:@a
  5. 使用:source s
  6. 编写自定义插件