LoginSignup
3
4

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-07-31

Vim8ではALE + lightlineでエラー表示を行っていましたが、neovimへの移行にあたってエラーチェックをLanguageClient-neovimで行うことにしました。
(rustのエラーチェックで使えるものがrlsしか見つからなかったため、敢えてaleじゃなくてもいいと感じたのが発端。)
この際、エラーの取得方法が変わったため、備忘録として残しておきます。

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

今回使用したプラグイン

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

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

dein.toml
[[plugins]]
repo = 'w0rp/ale'
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
'''

(スクリーンショット)
2019-08-01-002703_1278x502_scrot.png

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

エラーチェックを行った結果は、LanguageClient-neovimの関数ではなく、getqflist()関数から辞書型で取得できました。
今回は最低限の設定なので、パフォーマンス等の問題はあると思います。良い書き方があれば教えて頂けると幸いです。

dein.toml
[[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
'''

(スクリーンショット)
2019-08-01-003215_1278x502_scrot.png

おわりに

以上の設定で、外観を変化させずにエラー表示を行うことができました。
しかし、この方法ではエラー・警告が多くなるほど極端にパフォーマンスが落ちます。対策方法を見つけ次第、変更していく予定です。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4