🍺

[Neovim/coc.nvim]clangd/clang-formatでC/C++の快適な開発環境を整える

2021/04/06に公開

最近、低レイヤ理解のためにゼロからのOS自作入門をはじめました。

https://www.amazon.co.jp/dp/4839975868

この本を進めるにあたり、C/C++の(快適な)開発環境が必要になるので、clangdとclang-formatを導入してみました。

開発マシンはMac、エディタはNeoVimです。LSPクライアントはcoc.nvimを使用しています。NeoVimやcoc.nvimの導入方法については触れません。

clangd

インストール

clangdはLLVMプロジェクトの一部なので、MacであればHomebrewでllvmをインストールするだけで利用できます。

$ brew install llvm
$ clangd --version
clangd version 11.0.0

coc-clangdのインストール

coc.nvimがclangdに接続するために、coc-clangdというプラグインをインストールする必要があります。

:CocInstall coc-clangd

:CocConfigで設定を変更することができます。デフォルトのままでも補完やエラーチェックは行ってくれます。
私は保存時のオートフォーマットを有効にしたかったため、:CocConfigcoc-settings.jsonを開き、以下の設定を追加しました。

coc-settings.json
  "coc.preferences.formatOnSaveFiletypes": [
    "cpp"
  ],

セットアップ

各種インストールすれば完了、というわけではありません。

clangdがソースコードの内容・依存関係を把握するためにcompile_commands.jsonまたはcompile_flags.txtというファイルを作成する必要があります。

compile_flags.jsonについては、makeまたはcmakeを使用してビルドしている場合は簡単に作成することができます。

make

compiledbを利用するとcompiledb makeというコマンドでcompile_commands.jsonも合わせて出力してくれます。

$ pip install compiledb
$ compiledb make

参考:Big Sky :: clangd を使う時に便利なコマンド compiledb

cmake

cmake実行時に-DCMAKE_EXPORT_COMPILE_COMMANDS=1というオプションを付ければcompile_commands.jsonを作成してくれます。

$ mkdir build
$ cd build
$ cmake .. -DCMAKE_EXPORT_COMPILE_COMMANDS=1

# 作業ディレクトリのルートにシンボリックリンクをはる
$ ln -s $(pwd)/compile_commands.json $(pwd)/../

それ以外

makeやcmakeを使っていない場合はcompile_flags.txtを手で作成して作業ディレクトリのルートに配置することで補完や定義へ移動等が有効になります。

# 例
-I/usr/local/include

参考:Getting started

clang-format

インストール

clang-formatもLLVMプロジェクトの一部なので、(Macの場合)llvmをインストールすると一緒にインストールされます。

$ clang-format --version
clang-format version 11.0.0

セットアップ

.clang-formatというファイルを作成して作業ディレクトリにルートに配置します。

各設定の意味は下記に記載されています。

Clang-Format Style Options

膨大なので全部目を通して一から.clang-formatを作成するのは大変かもしれません。 そのため、以下のコマンドで-styleに指定したルールを一式を.clang-formatに出力して利用します。

$ clang-format -style=llvm --dump-config > .clang-format

-styleには以下の種類があります。私はとりあえずgoogleを指定しています。

LLVM A style complying with the LLVM coding standards

Google A style complying with Google’s C++ style guide

Chromium A style complying with Chromium’s style guide

Mozilla A style complying with Mozilla’s style guide

WebKit A style complying with WebKit’s style guide

Microsoft A style complying with Microsoft’s style guide

GNU A style complying with the GNU coding standards

参考:Configurable Format Style Options

使ってみる

ここまで準備できたらclangdによる補完や定義へ移動、clang-formatによるコードの自動整形が有効になります。

clangdの導入前は以下のようにインクルードしているヘッダーが見つからず警告が出ています。

clangdとclang-formatのセットアップ完了後、以下のように警告は消えてコードも整形されます。

hoverで定義やヒントを確認することができます(coc.nvimの設定が必要です)。

Discussion