tak0kadaの何でもノート

発声練習、生存確認用。

医学関連は 医学ノート

vim-lspとaleのインストール

YouCompleteMeをC++のためにインストールしていたが、Vim弱者のため設定が直せなくなってprabirshrestha/vim-lspw0rp/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の設定はどこかで拾ったので取りあえずコピペしてある。