aboutsummaryrefslogtreecommitdiffstats
path: root/lua/conform
diff options
context:
space:
mode:
Diffstat (limited to 'lua/conform')
-rw-r--r--lua/conform/init.lua63
-rw-r--r--lua/conform/runner.lua44
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