Vim
C++
LLVM
VSCode

clangd導入メモ

clangdとは

clangのLanguage Server Protocol 実装。

LSPはMicrosoftが提唱しているIDE支援のための統一プロトコル。
Language "Server"とあるとおり、言語支援のためのサーバーが常駐する。この手の機構を個別に備えた言語として、TypeScriptのtsserverとか、C#のOmniSharpなどが挙げられるけど、それの汎用版。

clangdはLLVMのフロントであるclangをベースとしたサーバーで、LLVMプロジェクトが公式に開発している。
コンパイラなので、コンパイルエラーの検出はもちろん、コード補完やフォーマット、定義ジャンプと参照元ジャンプ等には対応している。
なので、clang-formatやRTagsといったclang系ツールも、LSPクライアントを導入してしまえば、これらの個別設定をしなくてよい。

clangdのインストール

macだと、brew install llvm とかするとclangdもインストールされるらしい。未確認。
僕は未だにmacports使ってたせいか、知らんうちに手元に入ってた。port install llvm-5.0 で勝手にインストールされるらしい。

LLVMのソースからビルドする場合は、 https://clang.llvm.org/get_started.html あたりを読むべし。clangdはclang-tools-extraに入ってるので、svn co するのを忘れずに。

インストールしたら、 --version で確認できるよ(以下はソースからビルドした版)。

$ clangd --version
> LLVM (http://llvm.org/):
>   LLVM version 6.0.0svn
>   Optimized build with assertions.
>   Default target: x86_64-apple-darwin16.7.0
>   Host CPU: broadwell

エディタ側

vim

vimの場合は汎用LSPクライントをインストールし、こいつにclangdのパスを教えてやる流れ。

LSPクライアントはいくつかあるんだけど、僕は https://github.com/prabirshrestha/vim-lsp を利用している。
他と使い比べたわけでもないんだけど、作者がMSの人だしLSP慣れてんのかなーと思ってこれ使ってる。

この人のpluginは vim / nvimの非同期周りを吸収するasync.vimってのが出てくるので、セットでインストールしておく。

Plug 'prabirshrestha/async.vim'
Plug 'prabirshrestha/vim-lsp'
let g:lsp_log_verbose = 1
let g:lsp_log_file = expand('~/vim-lsp.log')
call lsp#register_server({
    \ 'name': 'clangd',
    \ 'cmd': {server_info->['clangd']},
    \ 'whitelist': ['c', 'cpp', 'objc', 'objcpp'],
    \ })

" オムニ補完設定
autocmd FileType typescript setlocal omnifunc=lsp#complete

VSC

LLVMが拡張作ってるので、これを入れるがよろし。

vscode-clangd

また、user/projectの設定で、clangdの在処を直接指定することも可能。

{
  "clangd.path": "/absolute/path/to/clangd"
}

compile_commands.json

clangdにコンパイラオプションとかを教える場合、compile_commands.json を作って、カレントディクレトリなりに置くとclangdがよしなに探索してくれる。
または clangd起動時に -compile-commands-dir オプションで、jsonファイルの在処を教える、でもよい。

compile_commands.json を作る方法はいくつかある。

例えばcmakeの場合は下記のように、 CMAKE_EXPORT_COMPILE_COMMANDS を有効にしてcmakeを実行すると、出力される。

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 .

シンプルにMakefileのみのプロジェクトの場合、Bear を使う。

bear make

Bazelだと、

https://github.com/grailbio/bazel-compilation-database

とか

https://gist.github.com/bsilver8192/0115ee5d040bb601e3b7

があるようだが、きちんと確認してない。