Linux

在vim中用字元序列換行

  • November 18, 2018

所以基本上我複制/粘貼了一些程式碼,我需要在每一行前面加上一些程式碼。每一行都是一個函式呼叫,並作為它自己的情況被添加到一個 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;"
                           /

改編自此 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與剩餘行一樣多的次數。

引用自:https://unix.stackexchange.com/questions/213342