YouCompleteMeをC++のためにインストールしていたが、Vim弱者のため設定が直せなくなってprabirshrestha/vim-lspとw0rp/aleに乗り換えた。vim-lspもaleもコードの解析にclangdを利用しており、compile_flags.txt
というファイルを置いておかないと、デフォルトの-Wall -std=c++14
が採用されC++17以降の機能を使うとエラーが出る。vim-lspについてはカレントディレクトリにcompile_flags.txt
を置いてやると自動で読み込んでくれるが、aleについてはその方法では解決しないため、g:ale_cpp_CXX_options
を設定してやる必要がある。また、vim-lspについてはvimのvirtualtextという機能を使ってエラー表示をインラインにしてくれるが、これもちょっとうるさいので出ないようにした。
Vimの非同期文法チェッカALEにプロジェクト固有の情報を教える - Qiitaを参考にして、vimrc.local
の代わりにcompile_flags.txt
を直接読むようにした。
init.vim
の該当部分
call plug#begin('~/.config/nvim/plugged') Plug 'prabirshrestha/async.vim' Plug 'prabirshrestha/vim-lsp' Plug 'prabirshrestha/asyncomplete.vim' Plug 'prabirshrestha/asyncomplete-lsp.vim' Plug 'w0rp/ale' call plug#end() """""" vim-lsp let g:lsp_diagnostics_enabled = 1 " disable diagnostics support 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_virtual_text_enabled = 0 let g:lsp_highlights_enabled = 0 let g:lsp_textprop_enabled = 1 nnoremap <Space>ld :LspDefinition<CR> " back to the original place by typing Ctrl-o nnoremap <Space>lf :LspDocumentFormat<CR> nnoremap <Space>lh :LspHover<CR> nnoremap <Space>lr :LspReferences<CR> " completion by C-p, selection by C-n, C-p, choosing by C-y, Enter if executable('clangd') augroup lsp_clangd autocmd! autocmd User lsp_setup call lsp#register_server({ \ 'name': 'clangd', \ 'cmd': {server_info->['clangd']}, \ 'whitelist': ['c', 'cpp', 'objc', 'objcpp'], \ }) autocmd FileType c setlocal omnifunc=lsp#complete autocmd FileType cpp setlocal omnifunc=lsp#complete autocmd FileType objc setlocal omnifunc=lsp#complete autocmd FileType objcpp setlocal omnifunc=lsp#complete augroup end endif if executable('pyls') augroup lsp_pyls autocmd! autocmd User lsp_setup call lsp#register_server({ \ 'name': 'pyls', \ 'cmd': {server_info->['pyls']}, \ 'whitelist': ['python'], \ }) autocmd FileType python setlocal omnifunc=lsp#complete augroup end endif """"" asyncomplete.vim inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>" inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>" inoremap <expr> <cr> pumvisible() ? "\<C-y>" : "\<cr>" autocmd! CompleteDone * if pumvisible() == 0 | pclose | endif """"" ale let g:ale_lint_on_save = 1 let g:ale_lint_on_text_changed = 1 let g:ale_lintOon_insert_leave = 1 augroup compileflag-text autocmd! autocmd BufNewFile,BufReadPost * call s:compileflag_text(expand('<afile>:p:h')) augroup END function! s:compileflag_text(loc) let files = findfile('compile_flags.txt', escape(a:loc, ' ') . ';', -1) for i in reverse(filter(files, 'filereadable(v:val)')) let g:ale_cpp_clang_options = system("cat " . i . "| tr '\\n' ' '") let g:ale_cpp_gcc_options = system("cat " . i . "| tr '\\n' ' '") endfor endfunction
PythonとRは対話モードでプログラムを書きつつエディタにコピペしているので、正直エディタの設定は不要だが、pythonの設定はどこかで拾ったので取りあえずコピペしてある。