わたすけです。clang-formatの解説をします。
clang-formatとは
clang-formatとは、C/C++用のフォーマッタです。
名前からわかるかもしれませんが、clangもといLLVM Projectの一貫です(この表現が正しいのかわからないですが、まあllvm/llvm-projectの中に入ってるのでいいでしょう)。
JavaScriptを書いている人は、Prettierというツールの名前を聞いたり、実際に使ったりしたことがあるのではないでしょうか?あれと同系統です。
これを使うと、ソースコードを決められたルールに沿って整形することが出来ます。
実際に使ってみる
こんなコードを書きます。ヤバいです。
ちなみに、当たり前ですがちゃんとビルドして実行できます。
では、clang-formatを使ってみましょう。Archだとclangをインストールしておけば使えます。
きれいになりましたね。batコマンドはcatの代替で、オプションでC言語であることを指定しています。
見てわかる通り、clang-formatはフォーマット結果を標準入力に出力します。必要であればリダイレクトなどをしましょう。
自動でフォーマットする
とは言ったものの、まあ面倒ですよね。大体のエディタでは、拡張機能などを用いて、保存した際に自動でフォーマットを行う設定をすることが出来ます。
VSCodeであれば、以下のような手順を踏みます。
C/C++拡張機能かclang-format拡張機能を導入
基本的に、C/C++拡張機能を入れておけば事足ります。補完機能とかもあるのでこっちを使ったほうが良いです。
ただ、フォーマッタだけじゃないと嫌!!という場合や、C/C++拡張が動かない!という場合は後者を入れましょう。
フォーマッタの設定をする
これは必要ない可能性もありますが、editor.defaultFormatter
に関する設定が必要な可能性があります。
ファイル保存時に自動でフォーマットするオプションをオンにする
editor.formatOnSave
をオンにしましょう。必要であれば editor.formatOnType
とかもオンにしておけば良いと思います。
ここまで設定したら、さっきのファイルを開いて・・・
保存してみます。
ちゃんとフォーマットされます。
もちろん、リダイレクトがどうとか面倒な事を考えなくても大丈夫です。
VSCode以外でもおそらくclang-formatに関する設定はできると思います。例えばNeovimを使っている人であれば、 rhysd/vim-clang-format
プラグインを導入してinit.vim等に「autocmd FileType c,cpp ClangFormatAutoEnable
」と記述したらいけます。
設定
clang-formatでは、ディレクトリにある .clang-format
ファイルから設定を読み込み、それに従ってフォーマットしてくれます。このファイルにYAML形式でルールを設定していくことになります。
例えば、void *hoge
と書いた時に void* hoge
とフォーマットしてほしければ、PointerAlignment
というルールをLeftに設定します。
全てのオプションと設定項目はここに載っています。たぶん141種類1ページのソースを開いてdtタグの数を調べたものあります。
まあ141種類ぜんぶ確認するのはなかなか大変だと思います。自分も30種類しか設定してません。
参考程度に、自分が使っている .clang-format
ファイルを置いておきます。だいたいコメントが付いてると思いますが、ついてなければ上のドキュメントで検索してください。
おわりに
フォーマッタは偉大です。最近Rustを書く機会が増えたのですが、Rustにはrust-fmtというフォーマッタがあり、重宝しています。もちろんJavaScriptを書く時はPrettierを使っています。
多分使い始めは大変だと思いますが、自分に合うルールを設定していけばどうにかなると思います。ルール通りのプログラムを書いてうれしくなりましょう。
コメント