efm-langserver を Vim/Neovim で利用する
最近 Vim と Neovim に efm-langserver を導入したので手順を説明していきます。
1. efm-langserver とは
mattn さんの記事を見るのが最良ですね。
Big Sky :: Lint ツールを Language Server に対応させるコマンド efm-langserver 作った。
どんな言語であろうとも Lint ツールが grep と同様の形式で結果を出力してくれさえすれば Language Server にしてしまうコマンド
Linter をインストールした後 Vim/Neovim で Info や Error を画面内に表示させたいときに efm-langserver が活用できると思えばよいです。
2. efm-langserver のインストール
Ubuntu 22.04 (WSL2) でのインストール手順を記載しておきます。
Go 言語を Go Wiki: Ubuntu - The Go Programming Language に従ってインストールします。
sudo add-apt-repository -y ppa:longsleep/golang-backports
sudo apt update
sudo apt install -y golang-go
efm-langserver を GitHub - mattn/efm-langserver: General purpose Language Server に従ってインストールします。
go install github.com/mattn/efm-langserver@latest
~/.profile
などに以下を追記して PATH を通しておきます。
export PATH="${HOME}"/go/bin:"${PATH}"
3. config.yaml の作成
efm-langserver 用設定ファイル $XDG_CONFIG_HOME/efm-langserver/config.yaml
に必要な設定を記述していきます。
README を参考に shellcheck を使うための設定のみ抽出したものが以下です。
version: 2
root-markers:
- .git/
lint-debounce: 1s
tools:
sh-shellcheck: &sh-shellcheck
lint-command: 'shellcheck -f gcc -x'
lint-source: 'shellcheck'
lint-formats:
- '%f:%l:%c: %trror: %m'
- '%f:%l:%c: %tarning: %m'
- '%f:%l:%c: %tote: %m'
languages:
sh:
- <<: *sh-shellcheck
4. Vim の設定
プラグインマネージャー dein.vim や dpp.vim などで採用されている TOML ファイルでのプラグイン設定箇所を抽出しました。遅延起動設定はお好みで。
[[plugins]]
repo = 'prabirshrestha/vim-lsp'
on_event = ['VimEnter']
[[plugins]]
repo = 'mattn/vim-lsp-settings'
on_source = ['vim-lsp']
hook_source = '''
let g:lsp_auto_enable = 1
let g:lsp_log_file = ''
let g:lsp_settings = {
\ 'efm-langserver': {
\ 'disabled': v:false,
\ 'allowlist': ['sh'],
\ }
\ }
'''
5. Neovim の設定
Vim 同様に TOML ファイルの記述を抽出しました。こちらも遅延起動設定はお好みで。
[[plugins]]
repo = 'neovim/nvim-lspconfig'
on_event = ['VimEnter']
lua_source = '''
local lspconfig = require('lspconfig')
lspconfig.efm.setup{}
'''
6. 感想
Linter をインストールできていれば出力形式を見て自力で Language Server として組み込める……素晴らしいですね!
Linter は手動でインストールして設定ファイルを管理しておくのが結局一番分かりやすいなと実感しているのですが、その状態で簡単に Vim/Neovim に反映できる efm-langserver はかなり有り難いです。