lightlineで動的にエラー表示を行うには、lightlineに用意されたイベントの仕組みを使う必要があります。
この仕組みをプラグインとして公開しているものはいくつかありますが、既存のLanguageClient-nvim用の設定が適用できない環境があったため、新しくプラグインを書きました。
作ったもの
https://github.com/takiyu/lightline-languageclient.vim
これまでの何が問題か
既存のプラグイン・情報
- Palpatineli/lightline-lsc-nvim
- 【Neovim】LanguageClinet-neovim + lightline.vimで簡易エラー表示
- solderneer/lightline-languageclient
LanguageClient-nvim用のプラグインや記事では組み込み関数getqflist()
を使用しているため、QuickFixにエラー情報を載せる設定にしていなければならない、という制約がありました。
すなわち、LanguageClient-nvimの標準の設定で
let g:LanguageClient_diagnosticsList = "Quickfix"
としているなら問題ありません。
しかしそれ以外の出力先にしている場合には、当然ですが正常に動作しません。
let g:LanguageClient_diagnosticsList = "Disabled" " or Locacion-list or fzf
この項目はvimgrepやジャンプリスト(g:LanguageClient_selectionUI
)の兼ね合いを考えた場合に設定することがあります。
やったこと
そこでLanguageClient-nvimが出力する生のエラー情報を用いてlightlineに伝わるようにしました。
LanguageClient#getState(callback)
を用いるとcallback関数にstateが渡されるAPIが存在します。
このstateを解析すればよいのですが、中身にvimのdictionary型ではなくてjsonの文字列が含まれているため、よしなにパースしました。
また残念ながらcallbackなAPIなため、合わせてlightline#update()
の呼び出し場所も変えています。
使い方
1.通常通りにプラグインをインストールします。
[[plugins]]
repo = 'takiyu/lightline-languageclient.vim'
など。
2.lightline側に表示用の設定をします。
let g:lightline = {}
let g:lightline.component_expand = {
\ 'linter_errors': 'lightline#languageclient#errors',
\ 'linter_ok': 'lightline#languageclient#ok',
\ }
let g:lightline.component_type = {
\ 'linter_errors': 'error',
\ 'linter_ok': 'left',
\ }
let g:lightline.active = {
\ 'right': [[ 'linter_errors', 'linter_ok' ]],
\ }
3.お好みで文字を変えてください。
let g:lightline#languageclient#indicator_ok = 'OK'
let g:lightline#languageclient#indicator_ns = 'N/S'
let g:lightline#languageclient#indicator_e = 'E:%d'
let g:lightline#languageclient#indicator_w = 'W:%d'
let g:lightline#languageclient#indicator_i = 'I:%d'
結論
LanguageClient#getState()
で頑張ると、QuickFixに依存しないLanguageClient-nvimのエラー表示が出来ます。
その他
PRお待ちしております。