2013-03-04 33 views
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)中的模板並調用生成輸出的外部腳本。然而,沒有運氣(不知道如何將寄存器的內容傳遞給外部腳本)。

歡迎任何其他方法。

回答

2

此命令可以完成這個工作:

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

你可以刪除%,如果你選擇了視覺系。如果經常使用,也可以爲其創建映射或用戶命令。

+0

感謝一個自定義插件,這是簡單而優雅。不知道'&'。 – 2013-03-04 14:10:26

1

您建議的方法看起來過於複雜,尤其是因爲您仍然需要將模板擴展邏輯實現爲外部腳本。

爲什麼不簡單地將您的模板定義爲:substitute命令?您可以模式匹配您的PLACEHOLDER通過/\({pattern}\)/和替換文本爲\1\2,等等。(我希望你知道對Vim :substitute指令的功率插入;否則,讀:help :s

您可以保留和堅持你在幾個方面的模板,這取決於你如何經常/長期需要他們:

  1. 只需在命令行歷史(:s<Up>
  2. 保存在命名寄存器(:let @a = @:),執行與:@a
  3. 保存在Vim腳本和:source
  4. 寫有:command小號
+0

感謝您的詳細解答。它並沒有跨過我的想法來使用:s,我同意我的方法更復雜:) – 2013-03-04 14:12:34