web-dev-qa-db-ja.com

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

別のファイルからコードをコピーすると、次のように書式設定が台無しになります。

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

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

228
Yongwei Xing

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

gg=G

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

521
Amir Rachum

Artistic Styleプログラムを使用するのが好きです。彼らの website によると:

Artistic Styleは、C、C++、C#、およびJavaプログラミング言語のソースコードインデンター、フォーマッター、および美化機能です。

Window、Linux、およびMacで実行されます。インデント、タブをスペースに置き換える、またはその逆、好きなように操作の周りにスペースを置く(好きな場合はif(x<2)をif ( x<2 )に変換する)、関数定義と同じ行にブレースを置く、またはそれらを移動するなどのことを行いますすべてのオプションはコマンドラインパラメータによって制御されます。

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

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

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

Astyleのオプション-T4pbは、私の好みです。 their docs に目を通し、オプションを変更してコードをフォーマットすることができます。

これがデモです。アスタイルの前:

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;
}

お役に立てば幸いです。

77
Derek

OPは自動フォーマットを要求しましたが、自動インデントのみを行う回答を受け入れました。

違いは次のとおりです。

オリジナル

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

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

AUTOINDENT

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

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

AUTOFORMAT

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

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

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

:!indent %
26
soulmerge

プラグインvim-autoformatを使用すると、1つのコマンド https://github.com/Chiel92/vim-autoformat でバッファー(またはバッファー選択)をフォーマットできます。そのために外部形式プログラムを使用し、vimのインデント機能にフォールバックします。

13

clang-formatがうまくいくことがわかりました。

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

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

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

autocmd FileType c,cpp setlocal equalprg=clang-format
9
Daniel

たぶん、あなたは以下を試すことができます$ indent -kr -i8 * .c

あなたの役に立つことを願っています!

3
lattimore

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

  1. 書式設定するコードのブロックを選択します V など。
  2. :!indentと入力してフォーマットします。

astyleもstdinを使用するため、同じトリックを使用できます。

3
dsummersl

追加したいのですが、最初に混乱するのを防ぐために、貼り付ける前に:set pasteと入力することができます。貼り付けた後、js-beautifyやインデントなどの作業のために:set nopasteと入力すると、再び機能します。

1
atripes

それらはindentというツールです。 apt-get install indentでダウンロードしてから、indent my_program.cを実行できます。

0
n0va_sa