stevearc / conform.nvim

Lightweight yet powerful formatter plugin for Neovim
MIT License
3.27k stars 166 forks source link

feature request: #504

Open beaumccartney opened 4 months ago

beaumccartney commented 4 months ago

Did you check existing requests?

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(??)

shubham-cpp commented 4 months ago

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 ?

bpinto commented 4 months ago

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

RingOfStorms commented 1 month ago

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" })