【Neovim】LanguageClinet-neovim + lightline.vimで簡易エラー表示

専門
スポンサードリンク

Vim8では`ALE + lightline`でエラー表示を行っていましたが、neovimへの移行にあたってエラーチェックを`LanguageClient-neovim`で行うことにしました。

(rustのエラーチェックで使えるものがrlsしか見つからなかったため、敢えてaleじゃなくてもいいと感じたのが発端。)

この際、エラーの取得方法が変わったため、備忘録として残しておきます。

Vim8 :  ale.vim + lightline.vim
Neovim :  LanguageClient-neovim + lightline.vim

今回使用したプラグイン

Vim8のエラー表示設定(ALE)

プラグイン管理はShougo氏のdein.vimを使用しています。

[[plugins]]
repo = 'w0rp/ale'
on_cmd = ['ALEComplete']
hook_add = '''
    let g:ale_linters = {
        \ 'python': ['pyls'],
        \ 'rust': ['rls'],
        \}
    let g:ale_echo_msg_error_str = 'E'
    let g:ale_echo_msg_warning_str = 'W'
    let g:ale_echo_msg_format = '[%linter%] %code: %%s [%severity%]'
    let g:ale_open_list = 0
    let g:ale_lint_on_save = 0
    let g:ale_lint_on_text_changed = 1
'''

[[plugins]]
repo = 'itchyny/lightline.vim'
hook_add = '''
    set noshowmode
    set laststatus=2
    let g:lightline = {
        \ 'colorscheme': 'wombat',
        \ 'active': {
        \   'left': [
        \     ['mode', 'paste'],
        \     ['gitbranch', 'readonly', 'filename', 'modified'],
        \     ['ale'],
        \   ]
        \ },
        \ 'component_function': {
        \   'gitbranch': 'fugitive#head',
        \   'ale': 'ALEStatus',
        \ },
        \ 'separator': { 'left': "\u2b80", 'right': "\u2b82" },
        \ 'subseparator': { 'left': "\u2b81", 'right': "\u2b83" },
        \}

    function! ALEStatus() abort
        let l:count = ale#statusline#Count(bufnr(''))
        let l:errors = l:count.error + l:count.style_error
        let l:warnings = l:count.warning + l:count.style_warning
        return l:count.total == 0 ? 'ALE: OK' : 'ALE: E:' . l:errors . ' ' . 'W:' . l:warnings
    endfunction
'''

Neovimのエラー表示設定(LanguageClient-neovim)

エラーチェックを行った結果は、LanguageClient-neovimの関数ではなく、getqflist()関数から辞書型で取得できました。

今回は最低限の設定なので、パフォーマンス等の問題はあると思います。良い書き方があれば教えて頂けると幸いです。

[[plugins]]
repo = 'autozimu/LanguageClient-neovim'
rev = 'next'
build = 'bash install.sh'
hook_add = '''
    set completeopt-=preview
    let g:LanguageClient_autoStart = 1
    let g:lsp_package_path = expand("~/.lsp/")
    let g:LanguageClient_serverCommands = {
    \ 'python': ['pyls'],
    \ 'c': ['clangd'],
    \ 'cpp': ['clangd'],
    \ 'rust': ['rls'],
    \ 'java': [
        \ 'java',
        \ '-Declipse.application=org.eclipse.jdt.ls.core.id1',
        \ '-Dosgi.bundles.defaultStartLevel=4',
        \ '-Declipse.product=org.eclipse.jdt.ls.core.product',
        \ '-noverify',
        \ '-Xmx1G',
        \ '-jar',
        \ expand(g:lsp_package_path) . '/eclipse.jdt.ls/plugins/org.eclipse.equinox.launcher_1.5.500.v20190715-1310.jar',
        \ '-configuration',
        \ expand(g:lsp_package_path) . '/eclipse.jdt.ls/config_linux',
        \ '-data',
        \ expand(g:lsp_package_path) . '/eclipse.jdt.ls',
        \ ],
    \ }
'''

[[plugins]]
repo = 'itchyny/lightline.vim'
hook_add = '''
    set noshowmode
    set laststatus=2
    let g:lightline = {
        \ 'colorscheme': 'wombat',
        \ 'active': {
        \   'left': [
        \     ['mode', 'paste'],
        \     ['gitbranch', 'readonly', 'filename', 'modified'],
        \     ['lsp'],
        \   ]
        \ },
        \ 'component_function': {
        \   'gitbranch': 'fugitive#head',
        \   'lsp': 'LSPStatus',
        \ },
        \ 'separator': { 'left': "\u2b80", 'right': "\u2b82" },
        \ 'subseparator': { 'left': "\u2b81", 'right': "\u2b83" },
        \}

    function! LSPStatus() abort
        let l:errors = 0
        let l:warnings = 0
        for item in getqflist()
            if item["type"] == "E"
                let l:errors += 1
            else
                let l:warnings += 1
            endif
        endfor
        return l:errors + l:warnings == 0 ? "LSP: OK" : "LSP: E:" . l:errors . " " . "W:" . l:warnings
    endfunction
'''

 おわりに

以上の設定で、外観を変化させずにエラー表示を行うことができました。

しかし、この方法ではエラー・警告が多くなるほど極端にパフォーマンスが落ちます。対策方法を見つけ次第、変更していく予定です。

コメント

タイトルとURLをコピーしました