web-dev-qa-db-ja.com

VIMでC ++コードをフォーマットすることは可能ですか?

私はVIMを初めて使用します。私はいくつかのソースコードを手に入れました、そしてこれは混乱です。一見すると、少なくともコードの明確で整理されたビューを取得したいので、正しくフォーマット設定したいと思います。つまり、関数の深さなどに応じてインデントします。

それはVIMで実行できるのか、それ以外の場合は他のどのコマンドラインツールをお勧めできますか。

ありがとう

32
Open the way

Vimは真のスイスナイフですが、私はまだいくつかの仕事には外部ツールを好みます。この方法は、組み込みの同等の方法を使用するよりもはるかに直感的で覚えやすい場合があります。

インデントの場合は、スタイル全体でファイルバッファー全体をフィルター処理します。特にvimの達人でない場合は、astyleパラメータを数分で把握するのがはるかに簡単です。また、astyleは、出力を微調整する際の柔軟性を大幅に高めます。

最初にastyleをインストールします。
# apt-get install astyle

次に、vim内:
:%!astyle(単純なケース-astyleのデフォルトモードはC/C++)
または
:%!astyle --mode=c --style=ansi -s2(ansi C++スタイル、インデントレベルごとに2つのスペースを使用)
または
:1,40!astyle --mode=c --style=ansi(ansi C++スタイル、1〜40行目のみフィルター)

60
m000

次のことができます。

gg=G
27
codaddict

最近はclang形式を強くお勧めします。 clang-formatをインストールしたら、Vimにclang-formatを簡単に統合できます。

http://clang.llvm.org/docs/ClangFormat.html#vim-integration

それはあなたのC++コードを本当に理解する唯一のコード美化器であり、機械よりも人間のようにコードを美化することは本当にインテリジェントです。例えば。:

void TestFunction(int argument1, int argument2,
                  int argument3);
void TestFunctionVeryLongName(int argument1,
                              int argument2,
                              int argument3);
void TestFunctionWithRidiculouslyLongName(
    int argument1, int argument2, int argument3);
13
Yongwei Wu

Vim内からコードのフォーマットを可能にするvimプラグインがあります。これはvim-autoformatと呼ばれ、ここからダウンロードできます。

https://github.com/Chiel92/vim-autoformat

それはvimに外部コードフォーマットプログラムを統合します。たとえば、C、C++、C#、またはJavaコードをフォーマットする場合は、プログラムをスタイル別にインストールする必要があり、vimはそれをフォーマットとして設定します自動的にプログラムします。

4

結果は完璧ではないかもしれませんが、Vimは間違いなくこれを行います。

  1. まず、ビジュアルモードでファイル全体を選択します:ggVG
  2. 次に=を押して、すべてを再インデントします。

:help =を使用すると、equalコマンドの詳細を確認できます。

4
Mike Mueller

clang-format に依存するVimプラグインもあります: vim-clang-format

次に、書式設定コマンドを自分に適したものにマッピングするだけです。

4
BenC

C++コードは書きませんが、Javaコードをいくつか書きます。

代わりに、Vimはいくつかの一般的な言語のフォーマットをサポートしています。バッファ内のコード全体をフォーマットするためのショートカットを設定しました。編集したばかりの行に戻ります:)

" format the file
map <leader>fm gg=G'. 
2
code4j

M000の考えに沿った一般的な解決策は、外部ツールとして niversalIndentGUI を使用することです。

1
Mike Summers

ちょうどこの正確な問題を解決しなければならなかったので、私は時間を節約するために貢献したいと思いました。

gg=Gを使用してコードをインデントできます。しかし、自動インデントがどのように行われるかを微調整したい瞬間は、物事が理解しにくくなります。したがって、誤った空白が削除されることだけを気にし、書式設定スタイルをあまり気にしない場合は、組み込みであるため、gg=Gが最も簡単な方法です。

スタイルを制御したい場合(たとえば、コードを スタイルガイド に準拠させようとしている場合)、ファイルを処理するための外部ツールが必要になります。このツールは、vim内から:%!<toolname> <options>を使用して呼び出すことができます。これにより、ツールを介してファイルがパイプ処理され、処理された結果が再度読み込まれます。 (あなたはあなたがあなたのファイルにもしたい他の何かのためにこれを明らかに使うことができます)

次の質問は、どの外部ツールを選択する必要があるかということです。とにかく、方法は同じです:

  1. 選択したツールをインストールする
  2. それがあなたのパスにあることを確認してください
  3. 時間を節約するために使用するショートカットキーを作成するvimrcファイルに行を追加します
  4. これを使って。

ここで、どのツールを使用するかは、複製しようとしているスタイルによって異なります。広く使用されているスタイルを複製しようとしている場合、可能性は astyle だけです。

カスタムスタイルを複製する場合は、次の2つが必要です。

  1. niversalIndentGui -さまざまなオプションを試して、ソースファイルへの影響をライブプレビューできるフロントエンド
  2. パス内にインストールされている一連のソースコードフォーマットツール

ncrustifygreatcode の間では、必要なスタイルを完全に複製できるはずです。

実は嘘をついた。別の方法があり、その呼び出された clang-format があります。ただし、そのドキュメントとその初期段階にあるドキュメントを読みたいので、一部のオプションはあまり機能しません。ただし、これは美しいツールです(コードのASTを構成するため、間違いなく最も賢いツールです)。Windowsでも使用できます。

マニュアルを読むのに時間がかかる場合は、 GNU Indent も確認してください。

もちろん、最後の方法があります。これは、実際に時間をかけてvimのインデントルールを学び、自分のスタイルに合わせてルールを記述する方法です。時間はかかりますが、gg=Gで動作します。

Astyle vs uncrustify vs greatcodeに関するメモ:

  1. Astyleは一般的な書式設定に適していますが、変数の宣言を揃えたり、コメントのスタイルを変更したりすることはできません。
  2. Uncrustifyはastyleができない多くのことを実行できますが、必要なオプションの正しい組み合わせが見つかるまで、1時間遊んでみてください。 (または、多くの時間を無駄にしたい場合は、遺伝的アルゴリズムを使用して、スタイルに最適なオプションの組み合わせを見つけ、コードを共有してリンクを提供すると、私もそれを使用できるようになります:))

1つのツールを選択する必要がないことに注意してください。 vimを使用すると、1つのキーストロークをマッピングして複数のコマンドを連続して実行できるため、理論的にはこれらのツールの組み合わせを使用して、探しているものを正確に取得できます。

最後に重要なことですが、ここに私の.vimrcファイルからの抜粋があります。ここで、F12をマップして、いくつかのオプションを使用してastyleを呼び出します。

"A2 = attached brackets
"-s8 indent 8 spaces
"-xc attached braces to class declarations
"-xj remove braces for single statement ifs and elses
"-c convert tabs to spaces in the non-indentation part of the line
map <F12> :%!astyle -A2 -s8 -xc -xj -c<CR>

スタイルで私を判断しないでください。ツールを使用して、必要なものを再現してください。

0
Carl