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テンプレートをコマンドとして単純に定義してみませんか?! PLACEHOLDERビアをパターンマッチさせ/\({pattern}\)/、置換テキスト\1に、 などとして挿入することができます (Vim のコマンド\2の威力について知っていただければ幸いです。それ以外の場合は、 .:substitute:help :s

テンプレートを必要とする頻度/期間に応じて、いくつかの方法でテンプレートを保持および永続化できます。

  1. コマンドライン履歴のみ ( :s<Up>)
  2. 名前付きレジスタ ( :let @a = @:) に保存し、次で実行:@a
  3. Vim スクリプトに保存すると:source
  4. :commandsを使用してカスタム プラグインを作成する
于 2013-03-04T12:50:30.043 に答える