1

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

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

欢迎任何其他方法。

4

2 回答 2

2

这个命令将完成这项工作:

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

%如果您看到选定的行,您可以删除。如果经常使用,您也可以为其创建映射或用户命令。

于 2013-03-04T12:43:33.580 回答
1

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

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

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

  1. 就在命令行历史 ( :s<Up>)
  2. 保存在命名寄存器 ( :let @a = @:) 中,执行:@a
  3. 保存在 Vim 脚本:source
  4. :command用s编写一个自定义插件
于 2013-03-04T12:50:30.043 回答