Open5
warp: せっかくclangdをビルドしたんだから使いたい会(vim編)

使いたいよね。
LSPクライアントとしては vim-lsp がある。
難しいポイントは、
- プロジェクトごとに使うclangdが違う
- プロジェクトごとに
compile_commands.json
の場所が違う - そもそもビルドをdockerでやっているケースがある -- これは直接的にはサポートできない
一旦手動でやってみて、手元のconventionとしてgit configに覚えさせる方式が良いかな。。

プロジェクトのセットアップ
とりあえず CMake file api を有効化。これはソースコードを置いてあるディレクトリの列挙に使う。
あとはいつもの CMAKE_EXPORT_COMPILE_COMMANDS
。

vim-lspの導入と有効化
.vimrc
に、
Plug 'prabirshrestha/vim-lsp'
Plug 'prabirshrestha/asyncomplete.vim'
Plug 'prabirshrestha/asyncomplete-lsp.vim'
Plug 'rhysd/vim-healthcheck'
(手元では vim-plug
を使っているので Plug
。)
vim-lspのグローバル設定
" Configure vim-lsp
let g:lsp_auto_enable = 0
let g:lsp_log_verbose = 1
let g:lsp_log_file = expand('~/vim-lsp.log')
とりあえず auto_enable は切っておく。
augroup lsp_install
au!
autocmd User lsp_buffer_enabled call s:on_lsp_buffer_enabled()
augroup END
function YuniVimLspActivate()
call lsp#register_server({
\ 'name': 'default' ,
\ 'cmd': {server_info->['e:/yunibuild/llvm/bin/clangd.exe',
\ '--background-index',
\ '--clang-tidy',
\ '--compile-commands-dir=e:/repos/warpsdk/build-check' ]},
\ 'allowlist': ['c', 'cpp', 'objc', 'objcpp']})
call lsp#enable()
endfunction
nmap II :call YuniVimLspActivate()<CR>
そのかわり、 II
で有効化するように設定しておく。
コマンドの登録
function! s:on_lsp_buffer_enabled() abort
setlocal omnifunc=lsp#complete
setlocal signcolumn=yes
if exists('+tagfunc') | setlocal tagfunc=lsp#tagfunc | endif
nmap <buffer> gd <plug>(lsp-definition)
nmap <buffer> gs <plug>(lsp-document-symbol-search)
nmap <buffer> gS <plug>(lsp-workspace-symbol-search)
nmap <buffer> gr <plug>(lsp-references)
nmap <buffer> gi <plug>(lsp-implementation)
nmap <buffer> gt <plug>(lsp-type-definition)
nmap <buffer> <leader>rn <plug>(lsp-rename)
nmap <buffer> [g <plug>(lsp-previous-diagnostic)
nmap <buffer> ]g <plug>(lsp-next-diagnostic)
nmap <buffer> K <plug>(lsp-hover)
nnoremap <buffer> <expr><c-f> lsp#scroll(+4)
nnoremap <buffer> <expr><c-d> lsp#scroll(-4)
endfunction

つかい方
K
= よくあるhoverを表示する。
gd
= 定義に飛ぶ。 jumplistで移動することになる: CTRL + O
で戻る。 CTRL + I
で進む。
補完
入力は自動補完される。
CTRL + N
や CTRL + P
で候補を選ぶ。CTRL + Y
で補完枠を閉じる。それ以外のキーは入力継続となる。

GitリポジトリにCMakeした場所を覚えさせる
$ git config --local yunibuild.builddir.build-libc e:/repos/warpsdk/build-libc
$ git config --local yunibuild.builddir.build-check e:/repos/warpsdk/build-check
$ git config --local yunibuild.builddir.build-runtimes e:/repos/warpsdk/build-runtimes
(FIXME: これ多分 --worktree
の方が良いな。)
こういう感じで設定すると、
[yunibuild "builddir"]
build-libc = e:/repos/warpsdk/build-libc
build-check = e:/repos/warpsdk/build-check
build-runtimes = e:/repos/warpsdk/build-runtimes
config
ファイルに書き込まれる。 --get-regexp
で列挙もできる。
$ git config --get-regexp yunibuild.builddir.*
yunibuild.builddir.build-libc e:/repos/warpsdk/build-libc
yunibuild.builddir.build-check e:/repos/warpsdk/build-check
yunibuild.builddir.build-runtimes e:/repos/warpsdk/build-runtimes
単純に巡回して compile_commands.json
を連結するのが良いかな。 ... clangd-indexer
が無いやん。。