vimでCコードをオートフォーマット/インデントするにはどうすればよいですか?


250

別のファイルからコードをコピーすると、次のように書式が乱れます。

fun()
{
for(...)
{
for(...)
{
if(...)
{
}
}
}
}

このコードをvimでオートフォーマットするにはどうすればよいですか?


3
コードをインデントするだけでなく、フォーマットを検討している人にとっては、2番目の答え(私のもの)がそれに対処します。インデントを修正したいだけなら、受け入れられた答えが最も簡単な方法です。
デレク

回答:


566

次のキーストロークを試してください。

gg=G

説明:ggファイルの先頭に移動し=、インデントを修正するコマンドGであり、ファイルの最後まで操作を実行するように指示します。


28
これはコードをインデントするだけです。全体をオートフォーマットするために何かすることはできませんか?
N 1.1

7
違いはなんですか?
Ton van den Heuvel 2010年

3
@Ton van:違いについては私の答え参照してください(ここではコメントで説明できませんでした)。
Lazer、2010年

2
-1これはインデントのみを修正し、書式は修正しません(これは要求されていたものです)。
オリゴフレン2013

3
@oligofren OPの例にはインデントエラーのみが含まれており、彼は答えを受け入れたので、それが彼の意図したことだと思います。
Amir Rachum 2013

78

私はArtistic Styleプログラムを使いたいです。彼らのウェブサイトによると:

Artistic Styleは、C、C ++、C#、およびJavaプログラミング言語用のソースコードインデンター、フォーマッター、およびビューティファイヤーです。

Windows、Linux、Macで動作します。インデント、タブをスペースに、またはその逆に置き換え、操作の周りにスペースを入れます(変換if(x<2)( x<2 )それが好きな場合はする)、関数定義と同じ行に中括弧を付ける、またはそれらを以下の行など。すべてのオプションは、コマンドラインパラメータによって制御されます。

vimで使用するには、formatprgオプションを設定してから、gqコマンドを使用します。したがって、たとえば、私は私の.vimrcにあります:

autocmd BufNewFile,BufRead *.cpp set formatprg=astyle\ -T4pb

.cppファイルを開くたびに、formatprgに好きなオプションが設定されるようにします。次に、ggと入力してファイルの先頭に移動し、gqGし、標準に従ってファイル全体をフォーマットします。単一の関数のみを再フォーマットする必要がある場合は、関数の先頭に移動して、次のように入力します。gq][と、その関数だけが再フォーマットされます。

astyleのオプション-T4pbは、私の好みにすぎません。あなたが見ることができます彼らのドキュメント、オプションを変更して好きなようにコードをフォーマットすることができます。

こちらがデモです。アスタイル前:

int main(){if(x<2){x=3;}}

float test()
{
if(x<2)
x=3;
}

アスタイル後(gggqG):

int main()
{
    if (x < 2)
    {
        x = 3;
    }
}

float test()
{
    if (x < 2)
        x = 3;
}

お役に立てば幸いです。


3
他のフォーマットについては、このようなものはありますか?ruby、xml、jsonなど?
derGral 2011年

1
@Ryanはvim-autoformatを確認します。以下の回答を参照してください。BTW vim-autoformatは、特にastyleも使用します。
Chiel ten Brinke 2013

1
ありがとうございました!私は、関数宣言と同じ行に開始角かっこを必要としない唯一の人だと思い始めていました!
user3640967 16

27

コードを適切にインデントするための組み込みコマンドについては、すでに触れました(gg=G)。コードを美化したい場合は、indentなどの外部アプリケーションを使用する必要があります。%exモードの現在のファイルを表すので、次のように使用できます。

:!indent %


11

私はそれclang-formatがうまくいくと思います。

clangのドキュメントにいくつかのキーバインドの例があります

equalprgはvimでバインディングを使用することを好みます。これによりclang-formatG=ggまたはその他の=インデントオプションを呼び出すことができます。

以下を.vimrcファイルに追加するだけです。

autocmd FileType c,cpp setlocal equalprg=clang-format

3
最初にインストールする必要があります。たとえば、ubuntu 16.04以降の場合:sudo apt install clang-format
Eric Wang

3

多分あなたは次のことを試すことができます$ indent -kr -i8 * .c

お役に立てれば幸いです。


3

indent上記のように好きですが、ほとんどの場合、作業中のファイルの小さなセクションのみをフォーマットします。indentstdinからコードを取得できるので、非常に簡単です。

  1. などでフォーマットしたいコードのブロックを選択しますV
  2. と入力してフォーマットします:!indent

astyle stdinも取るので、そこで同じトリックを使用できます。


2

追加したいのは、:set paste貼り付ける前に最初に入力できる場所が台無しになるのを防ぐためです。貼り付けた後、:set nopastejs-beautifyやインデントなどを入力して、再び機能させることができます。


1
:set paste!貼り付けの値を設定するのではなく切り替えるために使用します。これにより、いくつかのコマンドをスクロールして戻り、Enterキーを押すだけで、簡単にオフにすることができます。
a'r

0

彼らはと呼ばれるツールですindent。でダウンロードしてapt-get install indent実行できますindent my_program.c

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