在vim中用字符序列换行所有行

在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 展示了一种使用正则表达式对序列重新编号的方法(假设您有一个现有序列)。

答案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与剩余行数一样多的次数。

相关内容