## 事象
[[Neovim]]起動時に以下のようなエラーが出る。
```error
[null-ls] You required a deprecated builtin (formatting/ruff.lua), which will be removed in March.
Please migrate to alternatives: https://github.com/nvimtools/none-ls.nvim/issues/58
[null-ls] You required a deprecated builtin (code_actions/shellcheck.lua), which will be removed in March.
Please migrate to alternatives: https://github.com/nvimtools/none-ls.nvim/issues/58
[null-ls] You required a deprecated builtin (formatting/rustfmt.lua), which will be removed in March.
Please migrate to alternatives: https://github.com/nvimtools/none-ls.nvim/issues/58
```
## 原因
[[none-ls.nvim]]の対象サーバーで以下2つを非推奨・排除する動きがあるから。
- メンテナンスされていないもの
- ネイティブの[[LSP]]を使用した方がいいもの ([[nvim-lspconfig]])
詳細は以下のDiscussionで議論されている。
<div class="link-card">
<div class="link-card-header">
<img src="https://github.githubassets.com/favicons/favicon.svg" class="link-card-site-icon"/>
<span class="link-card-site-name">GitHub</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<p class="link-card-title">Deprecating builtins with unmaintained upstream or native LSP replacement · nvimtools/none-ls.nvim · Discussion #81</p>
<p class="link-card-description">Related projects ... </p>
</div>
<img src="https://opengraph.githubassets.com/ebb31311abc1517da6919da8e2b8c0569793932fdb139b5dbbe3b5398b8470f3/nvimtools/none-ls.nvim/discussions/81" class="link-card-image" />
</div>
<a href="https://github.com/nvimtools/none-ls.nvim/discussions/81"></a>
</div>
## 解決方法
### Discussionのスレッド主に従う場合
上記のDiscussionで推奨されているモノを使う。たとえば本件では以下の3サーバーが対象になる。
| 置き換え対象 | 置き換え先 |
| -------------- | ------------------------ |
| [[Ruff]] | [[ruff-lsp]] |
| [[ShellCheck]] | [[Bash Language Server]] |
| [[rustfmt]] | [[rust-analyzer]] |
代替の原文は以下。
```
deleted: diagnostics/ruff.lua (use ruff lsp)
deleted: diagnostics/shellcheck.lua (use bashls / available in gbprod/none-ls-shellcheck.nvim)
deleted: formatting/rustfmt.lua (use rust-analyzer)
```
### そもそもDiscussionのお題が妥当ではないと考える場合
[[none-ls.nvim]]を`bb680d7`のコミットまで戻す。
上記のDiscussionでは反対意見や対応を疑問視する声も少なくない。そもそも、実際のプロジェクトは **鶴の一声で既存の[[フォーマッター]]や[[リンター]]の仕組みを簡単に変更できない** ということを忘れている。
また、これらがメンテナの負荷を下げるための施策という点にも疑問を呈されている方が多い。そこまでインターフェースがドラスティックに変更されることもないのに、数を減らすだけでそのデメリットを補う恩恵が得られるのかは疑問という考え方だ。
### 個人的な対応
#### ShellCheck
[[ShellCheck]]は[[Bash Language Server]]に移行してもそこまで問題なさそうなので移行した。[[none-ls.nvim]]の設定から以下を削除。([[ShellCheck]]自体のインストールは必要)
```diff
null_ls.setup({
sources = {
- null_ls.builtins.code_actions.shellcheck,
```
#### rustfmt
[[rustfmt]]は設定が残りそうなDiscussionのやりとりが見受けられるが、[[rust-analyzerのフォーマット機能にはrustfmtが使われている]]ようなので従ってみる。まずは[[none-ls.nvim]]の設定から削除。
```diff
null_ls.setup({
sources = {
- null_ls.builtins.formatting.rustfmt,
```
一方、ファイル保存時の自動フォーマットは[[none-ls.nvim]]で定義した[[Language Server]]に対してしか設定していない。詳しくは以下。
<div class="link-card">
<div class="link-card-header">
<img src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/favicon-64.png" class="link-card-site-icon"/>
<span class="link-card-site-name">minerva.mamansoft.net</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<p class="link-card-title">ファイルが保存されたときに自動フォーマット (none-ls.nvim)</p>
<p class="link-card-description">`on_attach`に設定する。[[Neovim]]のバージョンは0.9.5。</p>
</div>
<img src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/Notes/attachments/minerva-image.webp" class="link-card-image" />
</div>
<a class="internal-link" data-href="Notes/ファイルが保存されたときに自動フォーマット (none-ls.nvim).md"></a>
</div>
そのため、ファイルを保存しても[[nvim-lspconfig]]で定義した[[Language Server]]のフォーマットは実行されない。これを解消するため、以下の設定を追加する。
```lua
-- LSP key bindings
vim.api.nvim_create_autocmd("LspAttach", {
group = vim.api.nvim_create_augroup("UserLspConfig", {}),
callback = function(ev)
-- 中略
-- 保存時に自動フォーマット
vim.api.nvim_create_autocmd("BufWritePre", {
pattern = { "*.rs" }, -- none-lsでフォーマッターを使用しない拡張子のみ
callback = function()
vim.lsp.buf.format({
buffer = ev.buf,
async = false,
})
end,
})
end,
})
```
> [[ファイルが保存されたら自動フォーマット (nvim-lspconfig)]]
#### Ruff
同じ要領で、[[Ruff]]も[[ruff-lsp]]に移行する。
```diff
null_ls.setup({
sources = {
- null_ls.builtins.formatting.ruff,
```
[[nvim-lspconfig]]の設定に追加。[[Pyright]]は競合するので一旦何も考えずに無効化。(最終的には何かをトリガーに出し分けたい)
```diff
+ lspconfig.ruff_lsp.setup({ capabilities = capabilities })
- lspconfig.pyright.setup({ capabilities = capabilities })
+ -- lspconfig.pyright.setup({ capabilities = capabilities })
```
別途、[[ruff-lsp]]のインストールも必要。
```console
pip install ruff-lsp
```
[[Python]]ファイルも[[nvim-lspconfig]]のフォーマット対象に加える。
```diff
-- 保存時に自動フォーマット
vim.api.nvim_create_autocmd("BufWritePre", {
- pattern = { "*.rs" }, -- none-lsでフォーマッターを使用しない拡張子のみ
+ pattern = { "*.rs", "*.py" }, -- none-lsでフォーマッターを使用しない拡張子のみ
callback = function()
```