vimの便利なPlugin(その17)vim-clang-format

   2017/05/04

先日C++の補完プラグインvim-clangをその16で紹介いたしました。今回は、C、C++、Objective-C、JavaScript、Java、TypeScript、Protobufのコードを自動で整形するvim-clang-formatを紹介いたします。このプラグインは、clangコンパイラに同梱されているclang-formatという ツールを利用してvimで開いているC++等のファイルを整形します。ここでは、以下の環境で使用を前提にしています。

  • CentOS6.8 x86_64
  • vim-7.4
  • clang-3.4.2

Install

今回もdein.vimを前提とさせていただきます。 まだ、dein.vimを使っていない方は(その5)から。 また、vim-operator-userというプラグインと一緒に使うと更に便利になります。

.vimrcに以下の行を追加します。

call dein#add('rhysd/vim-clang-format')
call dein#add('kana/vim-operator-user')

これで「:call dein#install()」をコマンドラインモードで実行すればvim-clangとvim-operator-userのインストールは終了。 また、当然ですがclang もインストールする必要があります。

# yum install epel-release
# yum install clang

 

以上でvim-clang-formatを使う準備ができました。

使い方

まず、何も設定すること無しに動作を確認してみます。 サンプルとして適当なC++ファイルを作成してみます。

このファイルを:ClangFormat コマンドで整形してみます。

 

 

綺麗に整形されているのが分かると思います。このままでも良いのですが、開発プロジェクトにあった形や、自分好みのフォーマットにカスタマイズする方法について以下で説明していきます。

設定

まず、毎回 :ClangFormatコマンドを実行するのは面倒ですのでショートカットキーを~/.vimrcに以下を記述します。

autocmd FileType c,cpp,objc map <buffer><Leader>f <Plug>(operator-clang-format)

これで自分で設定している<Leader>キーと f キー で整形を実行できます。 上記の通りvim-operator-userもインストールしていれば、ビジュアルモードで選択した範囲のみの整形もできます。

vim-clang-formatのコーディングスタイルの設定は、llvm、google、chromium、mozillaがサポートされています。初期設定は、googleになっていますので変更したい場合は、~/.vimrcに以下を記述します。

let g:clang_format#code_style = ‘llvm’

次に、コーディングスタイルのオプションを設定してみます。 例えば私は、以下の様にオプションを設定しています。

let g:clang_format#style_options = {
\   “AlignConsecutiveAssignments”: “true”,
\   “Cpp11BracedListStyle”: “true”,
\   “DerivePointerAlignment”: “false”,
\   “IndentCaseLabels”: “true”,
\   “IndentWidth”:     4,
\   “KeepEmptyLinesAtTheStartOfBlocks”: “true”,
\   “PointerAlignment”: “Right”,
\   “SpacesBeforeTrailingComments”: 1,
\   “Standard”:        “Cpp11”,
\   “TabWidth”:        4,
\   “UseTab”:          “ForIndentation” }

AlignConsecutiveAssignments をtrueにすると連続する代入演算子をそろえます。例えば、

 

DerivePointerAlignment をtrueにすると

 

*や&の位置を調整します。

IndentCaseLabels をtrueにすると switch文内のcase文をインデントします。

IndentWidth の数値は、インデントに使用する列の数を指定できます。

KeepEmptyLinesAtTheStartOfBlocks をtrueにするとブロックの開始に空行があってもそれを保持したままにします。

PointerAlignment には、Left、Right、Middleの値が設定でき、

 

SpacesBeforeTrailingComments の数値は、コメント「//」の前のスペースの数となります。

Standard は規格を指定します。 例えば、Cpp11はC++11に従います。

TabWidth の数値はタブの幅を指定します。

UseTab には Never、ForIndentation、Alwaysをしていできそれぞれ「タブを使わない」、「インデントのみにタブを使う」、「常にタブを使う」設定になります。 タブまたはスペースのどちらでインデントするかは好みが分かれるところだと思いますが、私は必ずタブにしています。

これらオプションの設定は、以下のサイトを参考にさせていただきました。

参考サイト algo13.net

  • このエントリーをはてなブックマークに追加
  • Pocket

この記事へのコメントはこちら