vimでは、すべての行を文字順に囲みます。

vimでは、すべての行を文字順に囲みます。

したがって、基本的にいくつかのコードをコピー/貼り付けて、各行の前にコードを追加して追加する必要があります。各行は関数呼び出しであり、その用語に従ってスイッチ文に追加されます。

これで、次のようになります。

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問題は、私が正規表現に慣れておらず、何を入れるべきかわからないということです。どんなアイデアがありますか?

編集:Muruの回答を見た後に投稿する必要があることに気づきました。これ番号付きセクションへのリンクです。例11は、正規表現を使用してシーケンス番号を再割り当てする方法の1つを示しています(既存のシーケンスがあると仮定)。

ベストアンサー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 Wikiの投稿

はい、わかりました。これはとても醜いです。より良い方法があります。


別の方法はマクロを使用することです:(最初の行から始めて、なしcase

qq
k:s/\v(case \d+: retVal = )(.*)\n(\s*)(.*)/\1\2\r\1\4 break;/|exe "norm \<c-a>"
j
q

@q次に、残りの行と同じ数回使用します。

おすすめ記事