diff options
author | Steven Arcangeli <stevearc@stevearc.com> | 2023-08-28 08:41:02 -0700 |
---|---|---|
committer | Steven Arcangeli <stevearc@stevearc.com> | 2023-08-28 08:41:02 -0700 |
commit | a4d793e941e8e497ab9149ed09c946473d795c1b (patch) | |
tree | 909ac23146ce50b0a0cd5a67fc8f54eca4af723a /lua | |
parent | 27494d493bf8059e94b3074af6f6fa3747d72ca9 (diff) |
feat: can silence notification when running formatters (#7)
Diffstat (limited to 'lua')
-rw-r--r-- | lua/conform/init.lua | 63 | ||||
-rw-r--r-- | lua/conform/runner.lua | 44 |
2 files changed, 65 insertions, 42 deletions
diff --git a/lua/conform/init.lua b/lua/conform/init.lua index 7acd879..93d558a 100644 --- a/lua/conform/init.lua +++ b/lua/conform/init.lua @@ -87,6 +87,17 @@ M.setup = function(opts) end end +---@param bufnr integer +---@return boolean +local function supports_lsp_format(bufnr) + for _, client in ipairs(vim.lsp.get_active_clients({ bufnr = bufnr })) do + if client.supports_method("textDocument/formatting", { bufnr = bufnr }) then + return true + end + end + return false +end + ---Format a buffer ---@param opts? table --- timeout_ms nil|integer Time in milliseconds to block for formatting. Defaults to 1000. No effect if async = true. @@ -94,14 +105,18 @@ end --- async nil|boolean If true the method won't block. Defaults to false. --- formatters nil|string[] List of formatters to run. Defaults to all formatters for the buffer filetype. --- lsp_fallback nil|boolean Attempt LSP formatting if no formatters are available. Defaults to false. +--- quiet nil|boolean Don't show any notifications for warnings or failures. Defaults to false. ---@return boolean True if any formatters were attempted M.format = function(opts) + ---@type {timeout_ms: integer, bufnr: integer, async: boolean, lsp_fallback: boolean, quiet: boolean, formatters?: string[]} opts = vim.tbl_extend("keep", opts or {}, { timeout_ms = 1000, bufnr = 0, async = false, lsp_fallback = false, + quiet = false, }) + local log = require("conform.log") local formatters = {} if opts.formatters then @@ -110,44 +125,40 @@ M.format = function(opts) if info.available then table.insert(formatters, info) else - vim.notify( - string.format("Formatter '%s' unavailable: %s", info.name, info.available_msg), - vim.log.levels.WARN - ) + if opts.quiet then + log.warn("Formatter '%s' unavailable: %s", info.name, info.available_msg) + else + vim.notify( + string.format("Formatter '%s' unavailable: %s", info.name, info.available_msg), + vim.log.levels.WARN + ) + end end end else formatters = M.list_formatters(opts.bufnr) end + local formatter_names = vim.tbl_map(function(f) + return f.name + end, formatters) + log.debug("Running formatters on %s: %s", vim.api.nvim_buf_get_name(opts.bufnr), formatter_names) + local any_formatters = not vim.tbl_isempty(formatters) if any_formatters then if opts.async then require("conform.runner").format_async(opts.bufnr, formatters) else - require("conform.runner").format_sync(opts.bufnr, formatters, opts.timeout_ms) + require("conform.runner").format_sync(opts.bufnr, formatters, opts.timeout_ms, opts.quiet) end - end - - if not any_formatters then - if opts.lsp_fallback then - local supports_lsp_formatting = false - for _, client in ipairs(vim.lsp.get_active_clients({ bufnr = opts.bufnr })) do - if client.server_capabilities.documentFormattingProvider then - supports_lsp_formatting = true - break - end - end - - if supports_lsp_formatting then - local restore = require("conform.util").save_win_positions(opts.bufnr) - vim.lsp.buf.format(opts) - if not opts.async then - restore() - end - end - else - vim.notify("No formatters found for buffer. See :checkhealth conform", vim.log.levels.WARN) + elseif opts.lsp_fallback and supports_lsp_format(opts.bufnr) then + log.debug("Running LSP formatter on %s", vim.api.nvim_buf_get_name(opts.bufnr)) + local restore = require("conform.util").save_win_positions(opts.bufnr) + vim.lsp.buf.format(opts) + if not opts.async then + restore() end + elseif not opts.quiet then + vim.notify("No formatters found for buffer. See :checkhealth conform", vim.log.levels.WARN) end return any_formatters diff --git a/lua/conform/runner.lua b/lua/conform/runner.lua index 0ac73df..7ccaec6 100644 --- a/lua/conform/runner.lua +++ b/lua/conform/runner.lua @@ -85,7 +85,7 @@ local function run_formatter(bufnr, formatter, input_lines, callback) if config.cwd then cwd = config.cwd(ctx) end - log.info("Running formatter %s on buffer %d", formatter.name, bufnr) + log.info("Run %s on %s", formatter.name, vim.api.nvim_buf_get_name(bufnr)) if not config.stdin then log.debug("Creating temp file %s", ctx.filename) local fd = assert(uv.fs_open(ctx.filename, "w", 448)) -- 0700 @@ -98,9 +98,9 @@ local function run_formatter(bufnr, formatter, input_lines, callback) final_cb(...) end end - log.debug("Running command: %s", cmd) + log.debug("Run command: %s", cmd) if cwd then - log.debug("Running in CWD: %s", cwd) + log.debug("Run CWD: %s", cwd) end local stdout local stderr @@ -130,12 +130,12 @@ local function run_formatter(bufnr, formatter, input_lines, callback) output = stdout end if vim.tbl_contains(exit_codes, code) then - log.debug("Formatter %s exited with code %d", formatter.name, code) + log.debug("%s exited with code %d", formatter.name, code) callback(nil, output) else - log.error("Formatter %s exited with code %d", formatter.name, code) - log.warn("Formatter %s stdout:", formatter.name, stdout) - log.warn("Formatter %s stderr:", formatter.name, stderr) + log.error("%s exited with code %d", formatter.name, code) + log.warn("%s stdout: %s", formatter.name, stdout) + log.warn("%s stderr: %s", formatter.name, stderr) local stderr_str if stderr then stderr_str = table.concat(stderr, "\n") @@ -212,7 +212,7 @@ M.format_async = function(bufnr, formatters, callback) local prev_jid = vim.b[bufnr].conform_jid if prev_jid then if vim.fn.jobstop(prev_jid) == 1 then - log.info("Canceled previous format job for buffer %d", bufnr) + log.info("Canceled previous format job for %s", vim.api.nvim_buf_get_name(bufnr)) end end @@ -223,7 +223,10 @@ M.format_async = function(bufnr, formatters, callback) if vim.b[bufnr].changedtick == changedtick then apply_format(bufnr, original_lines, input_lines) else - log.warn("Async formatter discarding changes for buffer %d: concurrent modification", bufnr) + log.info( + "Async formatter discarding changes for %s: concurrent modification", + vim.api.nvim_buf_get_name(bufnr) + ) end if callback then callback() @@ -235,9 +238,9 @@ M.format_async = function(bufnr, formatters, callback) local jid jid = run_formatter(bufnr, formatter, input_lines, function(err, output) if err then - -- Only display the error if the job wasn't canceled + -- Only log the error if the job wasn't canceled if vim.api.nvim_buf_is_valid(bufnr) and jid == vim.b[bufnr].conform_jid then - vim.notify(err, vim.log.levels.ERROR) + log.error(err) end if callback then callback(err) @@ -254,7 +257,8 @@ end ---@param bufnr integer ---@param formatters conform.FormatterInfo[] ---@param timeout_ms integer -M.format_sync = function(bufnr, formatters, timeout_ms) +---@param quiet boolean +M.format_sync = function(bufnr, formatters, timeout_ms, quiet) if bufnr == 0 then bufnr = vim.api.nvim_get_current_buf() end @@ -266,21 +270,25 @@ M.format_sync = function(bufnr, formatters, timeout_ms) local prev_jid = vim.b[bufnr].conform_jid if prev_jid then if vim.fn.jobstop(prev_jid) == 1 then - log.info("Canceled previous format job for buffer %d", bufnr) + log.info("Canceled previous format job for %s", vim.api.nvim_buf_get_name(bufnr)) end end for _, formatter in ipairs(formatters) do local remaining = timeout_ms - (uv.hrtime() / 1e6 - start) if remaining <= 0 then - vim.notify(string.format("Formatter '%s' timed out", formatter.name), vim.log.levels.WARN) + if quiet then + log.warn("Formatter '%s' timed out", formatter.name) + else + vim.notify(string.format("Formatter '%s' timed out", formatter.name), vim.log.levels.WARN) + end return end local done = false local result = nil run_formatter(bufnr, formatter, input_lines, function(err, output) if err then - vim.notify(err, vim.log.levels.ERROR) + log.error(err) end done = true result = output @@ -292,7 +300,11 @@ M.format_sync = function(bufnr, formatters, timeout_ms) if not wait_result then if wait_reason == -1 then - vim.notify(string.format("Formatter '%s' timed out", formatter.name), vim.log.levels.WARN) + if quiet then + log.warn("Formatter '%s' timed out", formatter.name) + else + vim.notify(string.format("Formatter '%s' timed out", formatter.name), vim.log.levels.WARN) + end end return end |