🐷

clangdの設定ファイル

2024/05/15に公開

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
Motivation

Vimでコード例や設定例を出していますが、vscodeでも同じように適用できます。

結論だけ知りたい方へ

とりあえずすぐ使えればいいという方は
.clangdという名前で以下のYAMLをプロジェクトルートに保存しましょう。
ただしUbuntuに限ります。

.clangd
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-directoryg++-v(verbose)オプションを付けると表示されます。

vim-lspとclangdの準備

vim-lsp-settingsを使用している前提です。
.vimrcに以下を記述してclangdが起動する際に--enable-configオプションを加えます。このオプションを付けることで後述するclangd設定ファイルの.clangdを読み込み出来るようになります。

.vimrc
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
  • プロジェクト設定用: .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の設定です。以下の画像を見たほうが説明が早いでしょう。

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で型エイリアスで宣言した変数の元の型名を表示してくれます。

Hover

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++
GitHubで編集を提案

Discussion