vimでC++書くんだったら vim-lsp + cquery 使おうぜ
つい最近clangdについて記事を書きました
なんか矛盾してませんか
clangd,とっても優秀なのですが
・別ファイルにある定義先に飛べない ・メモリ消費量がエグい(6GB...)
などの欠点がありました
実はclangdを導入する前にcqueryを使う予定でしたが、そのときはうまく行かなかったので、ここに記したいと思います
cqueryの導入
brewやaurを使ってインストールすると、バージョンが低いためにvimでエラーを吐きまくる事態になっていたので、直接 build したいと思います
基本ここの、"Build the language server" に従って行きますが
clangとllvmがインストールされているなら
ここにあるように
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†
これを見てやってもらうとプロジェクト内でもいい感じに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()
としてセッティングしています