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