-1

これで、次のようなテキスト ファイルができました。

{
    int fun(int a, int b    // match begin this line
       int c) {
       if (a == 0) {
          a = 1;
       } else {
          a = -1;
       }
       return 0;
    }    // mathc end this line
}

{
    int funNoMatch(int a, int b
       int c) {
       return 0;
    }
}

vimの正規表現を使用して、vimのfun()関数全体を一致させるにはどうすればよいですか?

次の正規表現を使用して、 fun() 関数の左中かっこまで行を一致させることができます。

/^ int fun\_[^{]*{

しかし... fun() 関数の右中かっこまで行を一致させることはできません。

も使用できます"\_"が、この状況では機能しません。

fun()関数のみを一致させ、 funNoMatchを一致させたくありませ

そして、vim正規表現でVimでそれらを一致させたいです。

誰でも私を助けることができますか?

ノート:

関数の最初と最後が同じインデント レベルであると想定できます。

何人かの良き友人が私の問題を解決するための別の方法を教えてくれました.

4

2 に答える 2

2

正規表現は適切なツールではないようです。マクロでそれを行う方法は次のとおりです。

qq        " start recording in register q
/fun(<CR> " jump to next fun(
ma        " create mark a here
/{<CR>    " jump to next {
%         " jump to closing }
d'a       " delete from here to mark a
q         " stop recording

100完了したら、そのマクロ(または任意の回数)を実行するだけで済みます。

100@q

マクロの良いところは、セッション間でマクロが保存されるため、後でその体操を行う必要がある場合@qでも、そこにあることです。


別の「ワンショット」ソリューションは、最愛:globalの and:normalコマンドを使用することです。

:g/fun(/norm! ma/{^M%d'a

^Mで挿入され<C-v><CR>ます。


マクロと を組み合わせると:global、非常にクールなツールができます: を使用:globalして一致fun(させ、関数名にとらわれないマクロを適用します。見てみましょう…</p>

まず、fun(行にカーソルを置きます。どのように行うかは問題ではありません。

次に、マクロを記録します。

qq        " start recording in register q
ma        " create mark a here
/{<CR>    " jump to next {
%         " jump to closing }
d'a       " delete from here to mark a
q         " stop recording

次に、一致するすべての行にマクロを適用しますfun(

:g/fun(/norm! @q

次回は、試合はfoobar(何でもかまいません。あなたは次のことをするだけです:

:g/foobar(/norm! @q

あまりタイピングせず、あまり考えず、瞬時に… いいですね。


これらの関数をすべて切り取って別のバッファに貼り付けるのも、同じロジックに従います。

:g/fun(/norm! ma/{^M%"Xd'a
:tabnew
"xp

ここで、すべての関数をxレジスターに追加し (大文字を使用X)、新しいタブで新しい空のバッファーを開き、xレジスターの内容を貼り付けます。

于 2013-06-11T05:55:09.240 に答える