vimでC++書くんだったら vim-lsp + cquery 使おうぜ

つい最近clangdについて記事を書きました

kutimoti.hatenablog.com

なんか矛盾してませんか

clangd,とっても優秀なのですが

・別ファイルにある定義先に飛べない
・メモリ消費量がエグい(6GB...)

などの欠点がありました

実はclangdを導入する前にcqueryを使う予定でしたが、そのときはうまく行かなかったので、ここに記したいと思います

cqueryの導入

brewやaurを使ってインストールすると、バージョンが低いためにvimでエラーを吐きまくる事態になっていたので、直接 build したいと思います

github.com

基本ここの、"Build the language server" に従って行きますが

clangとllvmがインストールされているなら

github.com

ここにあるように

1 $ git clone https://github.com/cquery-project/cquery --single-branch --depth=1
2 $ cd cquery
3 $ git submodule update --init && ./waf configure --variant=system --llvm-config=/usr/bin/llvm-config build

としたほうが良さそうです

あとは,cquery/build/system/binにパスを通します

vimに導入

ひゃひゃ

[[plugins]]
repo='prabirshrestha/async.vim'

[[plugins]]
repo='pdavydov108/vim-lsp-cquery'
hook_add='''
autocmd FileType c,cc,cpp,cxx,h,hpp nnoremap <leader>fv :LspCqueryDerived<CR>
autocmd FileType c,cc,cpp,cxx,h,hpp nnoremap <leader>fc :LspCqueryCallers<CR>
autocmd FileType c,cc,cpp,cxx,h,hpp nnoremap <leader>fb :LspCqueryBase<CR>
autocmd FileType c,cc,cpp,cxx,h,hpp nnoremap <leader>fi :LspCqueryVars<CR>
'''

[[plugins]]
repo='prabirshrestha/vim-lsp'
hook_add='''
if executable('cquery')
   au User lsp_setup call lsp#register_server({
      \ 'name': 'cquery',
      \ 'cmd': {server_info->['cquery']},
      \ 'root_uri': {server_info->lsp#utils#path_to_uri(lsp#utils#find_nearest_parent_file_directory(lsp#utils#get_buffer_path(), 'compile_commands.json'))},
      \ 'initialization_options': { 'cacheDirectory': '/tmp/cquery/cache' },
      \ 'whitelist': ['c', 'cpp', 'objc', 'objcpp', 'cc'],
      \ })
endif
let g:lsp_signs_enabled = 1         " enable signs
let g:lsp_diagnostics_echo_cursor = 1 " enable echo under cursor when in normal mode

let g:lsp_signs_error = {'text': '✗'}
let g:lsp_signs_warning = {'text': '‼'}

let g:asyncomplete_completion_delay=10
'''

[[plugins]]
repo='prabirshrestha/asyncomplete.vim'

[[plugins]]
repo='prabirshrestha/asyncomplete-lsp.vim'

compile_command.json

今話題の†json

github.com

これを見てやってもらうとプロジェクト内でもいい感じにcqueryが動いてくれます

単一ファイルで補完が出したい

競プロerの僕は一個のファイルだけを編集するので

それに合わせてcompile_command.jsonを構成しないといけません

いちいち書くのは面倒なので

function MakeCquery()
  let temp = expand('%:p')
  echo system('echo ''[{"directory": "/home/kutimoti/contest","command": "/usr/bin/c++  ' . temp . ' -std=c++11","file": "' . temp . '"}]'' > compile_commands.json')
endfunction

とinit.vimにしてやって

call MakeCquery()

としてセッティングしています

楽しいLSPコーディング生活を!