## 事象 以下のコードがある。 ```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]]のフォーマッターだけを無効化したい場合は、そのような条件に変える。