web-dev-qa-db-ja.com

Vimで関数定義全体を選択する

私は、ほぼ1週間テキスト編集作業のためにVimを試してきました。 C関数定義を選択する最速の方法を知りたいです。

たとえば、次のような関数がある場合:

void helloworlds( int num )
{
    int n;
    for ( n = 0; n < num; ++n ) {
        printf( "Hello World!\n" );
    }
}

関数名を含む定義全体を削除するにはどうすればよいですか?

47
Jacky Boen

Vimでよくあるように、たくさんの方法があります!

最初の2つの解決策は、空白行がないことに依存していることに注意してください。

  • カーソルが関数名のある行にある場合は、試してください d}。次のブロック(つまり、関数本体)までのすべてを削除します。

  • 関数本体内で、 dap 「段落」を削除します。

  • 波括弧ブロックを削除するには da}。 (この構文が気に入ったら、Tim Popeの素晴らしい surround.vim をお勧めします。これにより、同様の感触でより多くの機能が追加されます)。

  • 正規表現を使用して、次の左端のインデントされた閉じ中括弧まで削除することもできます。 d/^}Enter

  • ]] そして [[ 次/前の最初の列の中括弧に移動します(/および?上記の正規表現で。と組み合わせる d 動き、あなたは同じ効果を達成します。 Python-mode のようなアドオンでは、これらの 演算子は再定義されます まさにあなたが探しているものを意味します:関数から関数へ移動します。

ヘッダーを含むブロック全体を削除する方法

ヘッダー/名前、またはブロックの前の行にいる場合、 da} トリックを行う必要があります。

ブロックの下にいる場合は、Vim検索の便利な「オフセット」機能を利用することもできます。 d?^{?-1 最初の列の開き中括弧が最初に現れる前に、1行後ろに削除します。このコマンドは入力するのが少し難しいです。たぶん、あなたは<leader>ショートカット。

プラグイン

私はVimでCプログラミングをあまりしませんが、そのようなことを支援するプラグインは確かにあります。 Vimスクリプト または GitHubのミラー を試してください。

68
David Cain

次のような定義を含む関数全体を削除するには:

function tick() {
        // ... 
}
  • 関数名のある行に移動します。
  • カーソルを左中括弧に移動しますf{はそれを行うか、単に$
  • 押す - V%d(視線、一致するペアに移動、削除)

関数が次のように見える場合:

function tick() 
{
        // ... 
}
  • 関数名のある行に移動します。
  • Jjoin現在の行を次の行に押します。これにより、カーソルが最後の文字に移動します。結果の行で、{、次のコマンドに必要なものだけ。
  • 押す - V%d(視線、一致するペアに移動、削除。)

または

  • 関数名のある行に移動します。
  • 押す - V[Down]%d(視覚的な行、1行下に移動、一致するペアに移動、削除。)
18
Nick Zalutskiy

このショートカットを使用して、関数だけでなく、中括弧間の行、つまりif-elseステートメント間のコード、while、forループなども削除できます。

波括弧の開始/終了でShitf + v [視覚モードに切り替えます]を押します。

次に、] +}を押します。つまり、] + Shitf]-開始中括弧にいる場合。

次に、[+ {すなわち[+ Shitf [-エンドブレースにいる場合。

次に、DELキーを押して、選択した行を削除します。

5
Manikanda raj S

プラグインをインストールする場合は vim-textobj-function を使用すると、Visual Selectの場合はvifが、Visual Selectの場合はvafが関数を選択します。

dafは関数を削除します。署名付きの行と関数本体の両方({}

このプラグインによって定義されるテキストオブジェクトはより具体的であり、関数の本文が連続したテキストブロックであるか、行の最初の文字に配置される{に依存しません。

欠点は、外部プラグインに依存することです。

4
ecerulm

この簡単な方法を使用してください

   1.Go to the function definition 
   2.dd  - delete function definition 
   3.d    -start delete operation 
   4.shift+5(%) - delete the lines between { to }
4
Kalanidhi

最も簡単で直接的な方法は次のとおりです(関数内のどこでも機能します)。

v   enter visual mode
{   move to first brace in function (may have to press more than once)
o   exchange cursor from top to bottom of selection
}   extend selection to bottom of function
d   delete selected text

完全なコマンドシーケンスはv{o}d。同じ方法で削除する以外の操作もできることに注意してください。たとえば、関数をコピーするには、yの代わりにd(yank)を使用します。

3
Tyler Durden

別の方法は、関数の先頭の行に移動して、Vj%(またはV%%スタイルで開き中括弧を同じ行に配置する場合)。これにより、Visual-Lineモードになり、パーセントで対応する右中括弧に移動します。 2番目のスタイルでは、最初の%で選択した行の左中括弧に移動し、2番目でそれに対応する右中括弧に移動します。

括弧、括弧、Cスタイルの複数行コメント、およびプリプロセッサディレクティブでも機能します。

詳細については manual をご覧ください。

1
gvkv

関数が空白行で区切られている場合は、次のように入力します。

dip

これは「内部段落を削除する」ことを意味します。

1
wzFelix

前提条件:関数内のどこかにあります。を使用して、最初の行の前の閉じ中括弧に移動します

[]

次に、最初の行の次の閉じ中括弧まで削除します

d][
0
Hope

非視覚的な方法:

d/^}/e

...行beiningで}を検索して削除します(削除対象も含む)。

/e(上記の回答には記載されていません)がなければ、解決策は不完全です。

with /e-検索はマッチの終わりに行くので、閉じ括弧はincludedであり、コマンドはヤンクにも適しています:

y/^}/e
0
Asain Kujovic