ひどくインデントされたコードの再インデント


39

Vimのスマートインデント機能が気に入っています。これにより、適切にインデントされたコードブロックを作成できます。

私は定期的にバッファにコードをコピー/ペーストしますが、そのコードはしばしばフォーマットが不十分です。

理想的なのは、スマートインデントシステムを通じてコードを「再処理」することです。

そのようなことは可能ですか?

たとえば、次のコードをどのように「修正」しますか(より大きなブロックからの抽出-各行を手動で修正したくない...):

    else 
                {
                        m[c] = 5;
                Finished = true;
std::cout<<"(ID,R,E)"<<"-->"<<"("<<g[c]<<","<<r[c]<<","<<E1 <<")"<< std::endl;
std::cout << "\n"<<"finish-->" << r[c] << "\t" <<"E1-->"<< E1 <<"\n" ;
                }
        }

1
もともとインデントが不十分だったコード、またはVimに貼り付けたときに変更される適切にインデントされたコードを貼り付けることについて話していますか?
ジェームスサン

貼り付けられたコードは、最初からインデントが不十分です。例を挙げましょう
。...-rolfl

回答:


48

これは2つの方法のいずれかで行います。

インデント調整ペースト

まず、バッファ内のコードがフォーマットされているが、インデントのレベルが異なる場合、]p代わりにを使用しますp。これは、コードをそのまま貼り付けますが、インデントをシフトして、貼り付けられた最初の行が行Iと同じ深さになるようにしますオンです。

バッファにコピーされたEGソース

while (1) {
    dostuff();
}

EGを貼り付けた結果 ]p

int myfunc() {
    int i = 5; /* Cursor on this line before paste */
    while (1) {
        dostuff();
    }
 }

vimはwhileをと同じインデントレベルにしint iます。これは簡単ですが、コピーされたコードが適切にインデントされている場合にのみ機能します。

貼り付け後に再フォーマット

=vim のオペレーターは、構成されたフォーマット規則に基づいてコードを再フォーマットします。貼り付けの短いスニペットについては、で視覚モードに入りv、貼り付けた行を選択してからを押し=て再フォーマットします。

大きなペーストの場合、カーソルが最初に貼り付けられた行に移動し、vimが "84 more lines"のようなメッセージを表示するという事実を利用しています。次に、84==84行を入力してリフローします(もちろん、実際に貼り付ける行の数を84に置き換えます)。

参照資料

:help ]p 調整されたインデントペースト用

:help =カバー={motion}[count]==および{Visual}=カスタムまたは組み込みのインデントルールによるフィルタリング用


6
`[v`]を使用してビジュアルモードで貼り付けたコードを適切に選択できます
-craigp

1
@Badger明確にするために、そのbacktick-bracket-v-backtick-bracketですか?
-phatskat

1
うん..テキストエリアはバック
ティック

vimの=演算子は、 できれば+100 を指定した設定済みのフォーマットルール基づいてコードを再フォーマットします。日を節約できたかもしれません。
Wossname

1
<control + R> "を使用して貼り付けるので、挿入モードを終了する必要はありません。
A --- B

15

この=コマンドを使用して再インデントすることができます。

ほとんどの通常モードコマンドと同様に、モーションに適用できるため、貼り付けたコードをで再度インデントできます=']。これは、現在のカーソル位置から']マーク(ペーストの最後の行)までのインデントです。

= ビジュアルモードからも使用できます。

別の便利なコマンドは]p、現在の行と同じインデントレベルで貼り付けます。これは、周囲のテキストに応じて異なるインデント深さで、適切にインデントされたテキストを貼り付けるのに役立ちます。


7

使い方=ap (ニーモニックは「形式段落は、」)現在の段落をオートフォーマットするvimの試みを持つことになります。

再フォーマットする可能性のあるものに注意を払う場合vap、現在の段落を視覚的に選択するために(再フォーマット中の内容を視覚的に示すため)より賢く、より早く見つけることができます=。これは、vimが誤って再フォーマットすることを知っているファイルで役立ち、誤って他の行を誤ってフォーマットしたくありません。


4

既にバッファ内にあるファイルを再度インデントするには、次を使用しますgg=G。「インデントの修正」を参照

ファイルの一部を再インデントするには、さまざまな境界を=フィルターに適用できます(たとえば、==現在の行のみを修正します)。

:set pasteバッファーにテキストを貼り付ける前にテキストを貼り付けるときにインデントを変更しないようにするために、これにより、vimは貼り付けたばかりのテキストを自動インデントできなくなります。ものを貼り付けたら、set :nopaste完了したら使用に戻ることができます。こちらのvimdocをご覧ください

頻繁に貼り付けることに気付いた場合は、VimWikiでこのヒントを使用し、これらの行をに追加して、「貼り付けモード」トグルのキーを設定することをお勧めします.vimrc

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode

次に、ヒット<F2>して貼り付けモードを切り替えることができます。貼り付けモードがアクティブな場合、vimはステータス行に「PASTE」という単語を表示します。


2
この質問は、インデントを使用してコードを貼り付けることではなく、インデントが不十分なコードを修正することです。
-rolfl

4
あなたが投稿したコメントは見ませんでした。ただし、gg=Gファイル全体を再インデントするために引き続き使用できます。
バルガブバート

@rolflそのような場合に私が通常開始するのはgg=G、で、vim間違った部分を調べます。
ムル

より多くの制御が必要な場合(または繰り返しの手間を減らすastyle場合)は、バッファーを保存するときのようにコードフォーマットツールを呼び出す自動コマンドを追加することを検討してください。詳細については、SOに関するこの質問を参照してください。
バルガヴバート

2

ブレースブロックまたはブラケットブロックのブロック全体を自動的に再度インデントするには、ブラケットがある同じ行にカーソルを置き、を試してください=%。シフト幅を変更するには、などを使用します:set sw=2

これが期待どおりに機能しない場合は、インデントを手動で減らす(outdent)ために(必要な場合)<%繰り返してみてください.>%反対に使用します。

そう:

else
       {
         // some code
       }

になる:

else
{
  // some code
}

特定のコードについて、1行または数行を自動的に再インデントするには、次を試してください。

  • == 現在の行を再度インデントする
  • 5== 5行をインデントし直す

1行または数行のインデントを手動で増減するには、次を試してください。

  • << シフト幅スペースで現在の行のインデントを解除する
  • 5<< shiftwidthスペースで5行のインデントを解除する
  • >> 現在の行をshiftwidthスペースでインデントする
  • 5>> shiftwidthスペースで5行インデントするには
  • . 必要に応じて繰り返す

vテキストを選択して=(自動インデント)、<(インデント解除)、または>(インデント)を押すことにより、ビジュアルモード()でインデントを行うこともできます。

もう1つの方法は、次の方法でファイル全体のインデントを修正することですgg=G

スペースの代わりにタブを使用している場合:retabは、すべてのタブをスペースに置き換えます(タブをスペースに置き換える方法を参照してください)。


外部メソッドの場合、次を試すことができます。

  • Pythonコードを再フォーマットするためのpythonTidy。例:

    :%!pythonTidy
    

関連:



1

既存の回答にはすでに多くのことが記載されています。インデントに非常に頻繁に使用するマッピングを1つ追加するだけです。

nnoremap <Leader>i  mzgg=G`z

これがにマッピングされたvimrcを見てきました===

いずれにせよ、これは素晴らしいマッピングであり、特に他の場所からコピーされたコードを貼り付ける場合は特にこれを使用します。

またはautocmd、ディスクに変更を書き込む直前にVimがインデントするようにこれを配置することをお勧めします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.