aboutsummaryrefslogtreecommitdiffstats
path: root/lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua')
-rw-r--r--lua/conform/init.lua114
1 files changed, 71 insertions, 43 deletions
diff --git a/lua/conform/init.lua b/lua/conform/init.lua
index 93d558a..1c8b333 100644
--- a/lua/conform/init.lua
+++ b/lua/conform/init.lua
@@ -98,6 +98,65 @@ local function supports_lsp_format(bufnr)
return false
end
+---@param bufnr? integer
+---@return conform.FormatterInfo[]
+---@return conform.RunOptions
+local function list_formatters_for_buffer(bufnr)
+ if not bufnr or bufnr == 0 then
+ bufnr = vim.api.nvim_get_current_buf()
+ end
+ local formatters = {}
+ local run_options = {
+ run_all_formatters = false,
+ format_on_save = true,
+ }
+ local filetypes = vim.split(vim.bo[bufnr].filetype, ".", { plain = true })
+ table.insert(filetypes, "*")
+ for _, filetype in ipairs(filetypes) do
+ local ft_formatters = M.formatters_by_ft[filetype]
+ if ft_formatters then
+ if not vim.tbl_islist(ft_formatters) then
+ for k, v in pairs(ft_formatters) do
+ if k ~= "formatters" then
+ run_options[k] = v
+ end
+ end
+ ft_formatters = ft_formatters.formatters
+ end
+ for _, formatter in ipairs(ft_formatters) do
+ formatters[formatter] = true
+ end
+ end
+ end
+
+ ---@type conform.FormatterInfo[]
+ local all_info = {}
+ for formatter in pairs(formatters) do
+ local info = M.get_formatter_info(formatter)
+ table.insert(all_info, info)
+ end
+
+ return all_info, run_options
+end
+
+---@param formatters conform.FormatterInfo[]
+---@param run_options conform.RunOptions
+---@return conform.FormatterInfo[]
+local function filter_formatters(formatters, run_options)
+ ---@type conform.FormatterInfo[]
+ local all_info = {}
+ for _, info in ipairs(formatters) do
+ if info.available then
+ table.insert(all_info, info)
+ if not run_options.run_all_formatters then
+ break
+ end
+ end
+ end
+
+ return all_info
+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.
@@ -119,7 +178,9 @@ M.format = function(opts)
local log = require("conform.log")
local formatters = {}
+ local any_formatters_configured
if opts.formatters then
+ any_formatters_configured = true
for _, formatter in ipairs(opts.formatters) do
local info = M.get_formatter_info(formatter)
if info.available then
@@ -136,7 +197,10 @@ M.format = function(opts)
end
end
else
- formatters = M.list_formatters(opts.bufnr)
+ local run_info
+ formatters, run_info = list_formatters_for_buffer(opts.bufnr)
+ any_formatters_configured = not vim.tbl_isempty(formatters)
+ formatters = filter_formatters(formatters, run_info)
end
local formatter_names = vim.tbl_map(function(f)
return f.name
@@ -157,57 +221,21 @@ M.format = function(opts)
if not opts.async then
restore()
end
- elseif not opts.quiet then
+ elseif any_formatters_configured and not opts.quiet then
vim.notify("No formatters found for buffer. See :checkhealth conform", vim.log.levels.WARN)
+ else
+ log.debug("No formatters found for %s", vim.api.nvim_buf_get_name(opts.bufnr))
end
return any_formatters
end
----Retried the available formatters for a buffer
+---Retrieve the available formatters for a buffer
---@param bufnr? integer
---@return conform.FormatterInfo[]
M.list_formatters = function(bufnr)
- if not bufnr or bufnr == 0 then
- bufnr = vim.api.nvim_get_current_buf()
- end
- local formatters = {}
- local run_options = {
- run_all_formatters = false,
- format_on_save = true,
- }
- local filetypes = vim.split(vim.bo[bufnr].filetype, ".", { plain = true })
- table.insert(filetypes, "*")
- for _, filetype in ipairs(filetypes) do
- local ft_formatters = M.formatters_by_ft[filetype]
- if ft_formatters then
- if not vim.tbl_islist(ft_formatters) then
- for k, v in pairs(ft_formatters) do
- if k ~= "formatters" then
- run_options[k] = v
- end
- end
- ft_formatters = ft_formatters.formatters
- end
- for _, formatter in ipairs(ft_formatters) do
- formatters[formatter] = true
- end
- end
- end
-
- ---@type conform.FormatterInfo[]
- local all_info = {}
- for formatter in pairs(formatters) do
- local info = M.get_formatter_info(formatter)
- if info.available then
- table.insert(all_info, info)
- if not run_options.run_all_formatters then
- break
- end
- end
- end
-
- return all_info
+ local formatters, run_options = list_formatters_for_buffer(bufnr)
+ return filter_formatters(formatters, run_options)
end
---List information about all filetype-configured formatters