🤖

【Neovim】null-lsを導入してElixirのリンターcredoの実行結果を表示する

2022/04/24に公開

先日の記事でElixirの開発環境としてNeovimの環境を整えた話をしました。

同記事内で ale というプラグインを利用してcredoの結果を表示するという内容に触れていましたが、Neovimであれば null-ls という別のプラグインを使って同じことが出来たので記事にしてみます。

同じことが出来るならどちらでも良い気がするのですが、null-lsの方はlua言語をベースに実装されており、vim-scriptの資産も特になくluaでNeovimの環境を整えている自分には親和性がありそうということで乗り換えてみました。

最終的にこのようにcredoの警告が確認できるようになりました。

Image from Gyazo

null-lsで出来ること

READMEを見ると次のように記載があります。

Unlike the VS Code and coc.nvim ecosystems, Neovim doesn't provide a way for non-LSP sources to hook into its LSP client. null-ls is an attempt to bridge that gap and simplify the process of creating, sharing, and setting up LSP sources using pure Lua.

LSP(Language Server Protocol)の形式に沿っていないツールの出力をLSPの形式に変換してNeovimにbuilt-inされているclientに注入するという役割を担ってくれているようです。

Build-in Sources のドキュメントを見ると、有名どころのフォーマッターやリンターがズラズラと並んでいることが確認できます。

この中にElixirの静的コード解析ツールである credo も記述があり、これにしたがって導入できます。

https://github.com/jose-elias-alvarez/null-ls.nvim/blob/main/doc/BUILTINS.md#credo

導入

packer経由でinstallしたのち、sourcesに null_ls.builtins.diagnostics.credo を指定します。

use({ "jose-elias-alvarez/null-ls.nvim", requires = "nvim-lua/plenary.nvim" })

local null_ls = require("null-ls")

null_ls.setup({
	sources = {
		null_ls.builtins.diagnostics.credo
	},
})

動かしてみる

まっさらなmix projectを作って動かしてみます。

$ mix new sample
$ cd sample

credoを依存関係に追加したのち、依存を取得します。

mix.exs
  defp deps do
    [
      {:credo, "~> 1.6", only: [:dev, :test], runtime: false}
    ]
  end
$ mix deps.get

lib/sample.ex でcredoで怒られる実装をしてみると、credoの警告が各言語でインストールしたlanguage serverと同じような見た目で表示されます(記事冒頭のキャプチャ再掲)

Image from Gyazo

注意点

内部的には mix credo コマンドを叩いているため、current directoryがmix projectのrootである必要があります。

archiveをinstallして動かしてみたところ、Jasonのエラーが出てうまく動作せずでした。

https://stackoverflow.com/questions/43605882/is-there-anyway-to-install-credo-globally

まとめ

null-lsを導入して多種多様なリンター・フォーマッターの恩恵を受けることができ、快適なコーディング環境となります。

現状、私の端末では他にも

の設定を追加しています。開発している言語のツールに合わせてぜひ導入を検討してみてはいかがでしょうか。

参考

https://zenn.dev/nazo6/articles/c2f16b07798bab#フォーマッタ%2Fリンタ

https://www.reddit.com/r/neovim/comments/t0af8y/what_is_the_purpose_of_nulllsnvim_ive_read_the/

https://docs.microsoft.com/ja-jp/visualstudio/extensibility/language-server-protocol?view=vs-2022

Discussion