Open5

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

okuokuokuoku

使いたいよね。

LSPクライアントとしては vim-lsp がある。

https://github.com/prabirshrestha/vim-lsp

難しいポイントは、

  • プロジェクトごとに使うclangdが違う
  • プロジェクトごとに compile_commands.json の場所が違う
  • そもそもビルドをdockerでやっているケースがある -- これは直接的にはサポートできない

一旦手動でやってみて、手元のconventionとしてgit configに覚えさせる方式が良いかな。。

okuokuokuoku

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
okuokuokuoku

つかい方

K = よくあるhoverを表示する。

gd = 定義に飛ぶ。 jumplistで移動することになる: CTRL + O で戻る。 CTRL + I で進む。

補完

入力は自動補完される。

CTRL + NCTRL + P で候補を選ぶ。CTRL + Y で補完枠を閉じる。それ以外のキーは入力継続となる。

okuokuokuoku

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 が無いやん。。