Linux
在vim中用字元序列換行
所以基本上我複制/粘貼了一些程式碼,我需要在每一行前面加上一些程式碼。每一行都是一個函式呼叫,並作為它自己的情況被添加到一個 switch 語句中。
現在它看起來像:
switch(n) { case 1: retVal = foo("bar"); break; case 2: retVal = foo("Bar"); break; foo("bAr"); foo("BAr"); foo("BAR"); }
我需要它看起來像:
switch(n) { case 1: retVal = foo("bar"); break; case 2: retVal = foo("Bar"); break; case 3: retVal = foo("bAr"); break; case 4: retVal = foo("BAr"); break; case 5: retVal = foo("BAR"); break; }
我想出的最好的是:
:'<,'>s/I DONT KNOW/case SOMETHING: retVal = & break;/g
在哪里
I DON'T KNOW
以及SOMETHING
需要更改。問題是我對正則表達式不夠滿意,不知道該放什麼。有任何想法嗎?編輯:看到穆魯的回答後,我意識到我應該為編號部分發布此連結。範例 11 展示了一種使用正則表達式對序列重新編號的方法,假設您有一個現有序列。
假設您的視覺模式選擇僅限於帶有 just 的行
foo(...);
,我能想到的最好的方法是::let c=2|'<,'>g//let c=c+1|s/\v\S+/\="case ".c.": retVal = ".submatch(0)." break;"/
更具可讀性:
let counter = 2 '<,'>g// " for some reason, we need both markers and g// for `let` to work let counter = counter + 1 s/ \v " `\v` is "very magic" \S+/ " used for `\S` - all non-whitespace characters \= " Indicate that replacement is an expression "case " . " `.` concatenates strings counter . ": retVal = " . submatch(0) . " break;" /
是的,我知道。這很醜陋。存在更好的方法。
另一種方式,使用宏:(從第一行開始,不帶
case
)qq k:s/\v(case \d+: retVal = )(.*)\n(\s*)(.*)/\1\2\r\1\4 break;/|exe "norm \<c-a>" j q
然後使用
@q
與剩餘行一樣多的次數。