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

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

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

## 今回使用したプラグイン
- [Shougo/dein.vim](https://github.com/Shougo/dein.vim)
- [itchyny/lightline.vim](https://github.com/itchyny/lightline.vim)
- [w0rp/ale](https://github.com/w0rp/ale)
- [autozimu/LanguageClient-neovim](https://github.com/autozimu/LanguageClient-neovim)

## Vim8のエラー表示設定（ALE）
プラグイン管理はShougo氏の`dein.vim`を使用しています。

```vimscript: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346115/771e1ded-8e91-99e7-e24d-e8f9373abe08.png)

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

```vimscript: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346115/13ebf380-f365-7426-b33a-8a63253db187.png)

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