clangdの設定ファイル
vim-lspとclangdの設定方法について個人的にややこしかったので残しておきます。
環境
- Vim9.1
- vim-lsp
- vim-lsp-settings
- Ubuntu 22.04
- gcc 11.4.0
- clangd 14.0.0
モチベーション
C/C++を書こうとするときvim-lspでincludeパスなど適切に設定したい欲求に駆られました。というのもコーディングに際して以下の問題が出ていたのです。
- 標準ライブラリが補完されない
- 標準ライブラリのincludeパスに警告が出る
- stdの名前空間が解決できない
- プロジェクト内ヘッダーの解決が出来ない
要するに警告が出まくって嫌だなぁという気持ちになったのでした。
↓こんな感じ UZEEEEEEEEEEEEEEEEEEEEEEEEE
Vimでコード例や設定例を出していますが、vscodeでも同じように適用できます。
結論だけ知りたい方へ
とりあえずすぐ使えればいいという方は
.clangd
という名前で以下のYAMLをプロジェクトルートに保存しましょう。
ただしUbuntuに限ります。
If:
PathMatch: .*
CompileFlags:
Add:
- -Wall
- -xc++
- -std=c++17
- --target=x86_64-linux-gnu
- --include-directory=/usr/include/c++/11
- --include-directory=/usr/include/x86_64-linux-gnu/c++/11
Compiler: g++
--target
と--include-directory
を各環境に合わせて書き換えてください。
特に--include-directory
はg++
に-v
(verbose)オプションを付けると表示されます。
vim-lspとclangdの準備
vim-lsp-settingsを使用している前提です。
.vimrc
に以下を記述してclangdが起動する際に--enable-config
オプションを加えます。このオプションを付けることで後述するclangd設定ファイルの.clangd
を読み込み出来るようになります。
let g:lsp_settings = {
\ 'clangd': {
\ 'cmd': ['clangd', '--enable-config'],
\ }
\}
clangd設定ファイル(.clangd, config.yaml)
clangdは以下の2つの設定ファイルを読み込みます。clangdが動作中でも変更を反映してくれます。
-
ユーザー設定用:
config.yaml
-
Windows:
%LocalAppData%\clangd\config.yaml
-
macOS:
~/Library/Preferences/clangd/config.yaml
-
Linuxとその他:
$XDG_CONFIG_HOME/clangd/config.yaml
-
Windows:
-
プロジェクト設定用:
.clangd
プロジェクトルートに置きます
config.yaml
, .clangd
ともにyamlファイルで定義されています。
clangd設定内容
.clangd
をいじりながらご自身で試してみてください。
If
- PathMatch
- PathExclude
If:
PathMatch:
PathExclude:
CompileFlags
CompileFlags:
Add:
Remove:
Compiler:
Index
プロジェクトインデックスについての設定です。
適切に設定することで補完、定義ジャンプなどが高速化・高精度になります。
Background
Index:
Background:
External
Index:
External:
StandardLibrary
Index:
StandardLibrary:
Style
Style:
FullyQualifiedNamespaces:
Diagnostics
Completion
InlayHints
InlayHintsの設定です。以下の画像を見たほうが説明が早いでしょう。
位置指定子の可視化, auto
で宣言した変数の型を推測して表示, 関数の引数名の表示などをVirtual Textで表示します。
私は以下のようにDesignators
だけNoにしています。
InlayHints:
Enabled: Yes # InlayHintsスイッチ
Designators: No # 位置指定子の表示
DeducedTypes: Yes # 推論された型の表示
ParameterNames: Yes # 引数名の表示
BlockEnd: Yes # ブロック単位の終了を表示
TypeNameLimit: 24 # 型名長さの限度
Hover
Hoverで表示するスイッチを提供します。
現時点ではShowAKAのみのようです。ShowAKA(AKA: 別名)はユーザー定義型などの元の型名を表示してくれます。
Hover:
ShowAKA: Yes
たとえば以下の例ではusing VecI = vector<int>
として型エイリアスを設定しました。
vim-lspのLspHoverで型エイリアスで宣言した変数の元の型名を表示してくれます。
Sematic Tokens
設定例
これだけで結構不便は無いように思います。私はこの設定をconfig.yaml
に置いてます。
- 標準ライブラリがinclude補完が出来る
- プロジェクト内ヘッダのinclude補完が出来る
- 一通りの警告が出る
- InlayHints有効
If:
PathMatch: .*
CompileFlags:
Add:
- -Wall
- -xc++
- -std=c++17
- --target=x86_64-linux-gnu
- --include-directory=/usr/include/c++/11
- --include-directory=/usr/include/x86_64-linux-gnu/c++/11
Compiler: g++
Discussion