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が拡張作ってるので、これを入れるがよろし。
また、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だと、
とか
があるようだが、きちんと確認してない。