所以基本上我复制/粘贴了一些代码,并且我需要在每行前面添加和附加一些更多代码。每一行都是一个函数调用,并根据其自身情况添加到 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 展示了一种使用正则表达式对序列重新编号的方法(假设您有一个现有序列)。
答案1
假设您的视觉模式选择仅限于只有 的行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;"
/
改编自这篇 Vim wikia 帖子。
是的,我知道。这太丑了。存在更好的方法。
另一种方法,使用宏:(从第一行开始,不带case
)
qq
k:s/\v(case \d+: retVal = )(.*)\n(\s*)(.*)/\1\2\r\1\4 break;/|exe "norm \<c-a>"
j
q
然后使用@q
与剩余行数一样多的次数。