diff options
Diffstat (limited to 'lua')
-rw-r--r-- | lua/conform/init.lua | 114 |
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 |