## 事象
以下のコードがある。
```ts
declare let debounce: any;
declare let normalizePath: any;
declare let DEFAULT_HISTORIES_PATH: any;
declare let _this: any;
function main() {
const debouncedSaveData = debounce(async () => {
await _this.appHelper.saveJson(
normalizePath(
_this.settings.intelligentSuggestionPrioritization.historyFilePath ||
DEFAULT_HISTORIES_PATH,
),
_this.suggester.selectionHistoryStorage?.data ?? {},
);
}, 5000);
}
```
これを保存して[[none-ls.nvim]]を実行させると、該当するフォーマッターが存在しなくても `DEFAULT_HISTORIES_PATH`が以下のようにフォーマットされてしまう。
```ts
normalizePath(
_this.settings.intelligentSuggestionPrioritization.historyFilePath ||
DEFAULT_HISTORIES_PATH,
),
```
### [[none-ls.nvim]]の設定
```lua
return {
"nvimtools/none-ls.nvim",
config = function()
local null_ls = require("null-ls")
local augroup = vim.api.nvim_create_augroup("LspFormatting", {})
null_ls.setup({
sources = {
null_ls.builtins.formatting.biome.with({
only_local = "node_modules/.bin",
}),
null_ls.builtins.formatting.prettierd.with({
prefer_local = "node_modules/.bin",
disabled_filetypes = { "markdown" },
condition = function(utils)
local biome_support_filetypes =
{ "javascript", "typescript", "javascriptreact", "typescriptreact", "json", "jsonc" }
-- biome.json が対応していなければprettier
if not vim.tbl_contains(biome_support_filetypes, vim.bo.filetype) then
return true
end
-- biome.json が対応しててもbiome.jsonがなければprettier
return not utils.root_has_file({ "biome.json" })
end,
}),
null_ls.builtins.formatting.stylua,
null_ls.builtins.formatting.ruff,
null_ls.builtins.formatting.gofumpt,
null_ls.builtins.formatting.goimports,
null_ls.builtins.code_actions.shellcheck,
null_ls.builtins.formatting.shfmt,
null_ls.builtins.formatting.rustfmt,
},
on_attach = function(client, bufnr)
if client.supports_method("textDocument/formatting") then
vim.api.nvim_clear_autocmds({ group = augroup, buffer = bufnr })
vim.api.nvim_create_autocmd("BufWritePre", {
group = augroup,
buffer = bufnr,
callback = function()
vim.lsp.buf.format({
async = false,
filter = function(c)
local disabled_format_clients = { "lua_ls", "volar" }
return not vim.tbl_contains(disabled_format_clients, c.name)
end,
})
end,
})
end
end,
})
end,
}
```
### 詳細
[[none-ls.nvim]]をプラグインから外すと発生しない。
`setup`をしただけでは発生しない (以下のコード)。
```lua
{
"nvimtools/none-ls.nvim",
config = function()
local null_ls = require("null-ls")
null_ls.setup()
end
}
```
`sources`に`null_ls.builtins.formatting.prettierd`を指定すると、**[[prettierd]]はインストールされていなくても**発生する。
```lua
null_ls.setup({
sources = {
null_ls.builtins.formatting.prettierd,
}
```
- `null_ls.builtins.formatting.biome`でも発生する
- `null_ls.builtins.formatting.rustfmt`では発生しない
- `on_attach`の処理をコメントアウトすると発生しない
以上から、ファイル保存時に`NullLsInfo`で[[LSPクライアント]]のフォーマットを実行したとき、[[フォーマッター]]([[prettierd]])が実行可能か否かにかかわらず発生する事象っぽい。
## 原因
ファイルを保存したときに[[tsserver]]のフォーマット機能が実行されていたから。
## 解決方法
[[LSPクライアントのフォーマッターを無効化 (none-ls.nvim)|LSPクライアントのフォーマッターを無効化]]する。
```lua
callback = function()
vim.lsp.buf.format({
async = false,
-- これを追加
filter = function(c)
return c.name == "null-ls"
end,
})
end,
```
もし、[[tsserver]]のフォーマッターだけを無効化したい場合は、そのような条件に変える。