conform.nvim icon indicating copy to clipboard operation
conform.nvim copied to clipboard

feature request:

Open beaumccartney opened this issue 1 year ago • 3 comments

Did you check existing requests?

  • [X] I have searched the existing issues

Describe the feature

in the old syntax, I could list a few formatters to try in order, and stop at the first just in the setup call i.e. per filetype

conform.setup({
    formatters_by_ft = {
        javascript = { { "prettierd", "prettier" } },
    },
})

for js files, this would use prettierd if available, and prettier otherwise.

afaik that api's deprecated (message everytime I use it), but from my reading and code spelunking, its not actually possible to specify stop_after_first in the table

is it possible to use the old functionality without using the deprecated api?

Provide background

provided above

What is the significance of this feature?

strongly desired

Additional details

was an old feature, was removed(??)

beaumccartney avatar Jul 27 '24 00:07 beaumccartney

My question is, how to now run multiple formatters + conditionally run first available? In my config I had the following tldr; for go files run goimports + gofumpt (if available) or gofmt

require('conform').setup({
  formatters_by_ft = {
    go = { 'goimports', { 'gofumpt', 'gofmt' } },
    javascript = { { 'prettierd', 'prettier' }, 'eslint_d' },
    javascriptreact = { { 'prettierd', 'prettier' }, 'eslint_d' },
})

How can I now achieve this in stop_after_first ?

shubham-cpp avatar Jul 29 '24 16:07 shubham-cpp

https://github.com/stevearc/conform.nvim/blob/master/doc/recipes.md#run-the-first-available-formatter-followed-by-more-formatters

bpinto avatar Jul 30 '24 13:07 bpinto

In addition to the function linked above, I also made this expandFormatters so that you can just keep the old format, because calling the first in a custom function every time is silly

---@param bufnr integer
---@param ... string
---@return string
local function first(bufnr, ...)
	local conform = require("conform")
	for i = 1, select("#", ...) do
		local formatter = select(i, ...)
		if conform.get_formatter_info(formatter, bufnr).available then
			return formatter
		end
	end
	return select(1, ...)
end

local function expandFormatters(formatters)
	return function(bufnr)
		local result = {}
		for i = 1, #formatters do
			local formatter = formatters[i]
			if type(formatter) == "table" then
				result[i] = first(bufnr, unpack(formatter))
			else
				result[i] = formatter
			end
		end
		return result
	end
end
typescript = expandFormatters({ { "prettierd", "prettier" }, "rustywind", lsp_format = "fallback" })

RingOfStorms avatar Oct 04 '24 02:10 RingOfStorms