efm-langserver を Vim/Neovim で利用する

blog
tech
tech-vim
Author

uma-chan

Published

2024-01-27

Modified

2024-12-20

最近 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.vimdpp.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 はかなり有り難いです。