-- Formatting configuration with conform.nvim -- Autoformat on save with per-filetype formatters return { { "stevearc/conform.nvim", event = { "BufWritePre" }, cmd = { "ConformInfo" }, keys = { { "cf", function() require("conform").format({ async = true, lsp_fallback = true }) end, mode = { "n", "v" }, desc = "Format buffer", }, }, opts = { -- Formatters by filetype formatters_by_ft = { -- Go go = { "gofumpt", "goimports" }, -- Lua lua = { "stylua" }, -- JavaScript/TypeScript javascript = { "prettier" }, javascriptreact = { "prettier" }, typescript = { "prettier" }, typescriptreact = { "prettier" }, -- Web html = { "prettier" }, css = { "prettier" }, scss = { "prettier" }, -- Data formats json = { "prettier" }, jsonc = { "prettier" }, yaml = { "prettier" }, -- Markdown markdown = { "prettier" }, ["markdown.mdx"] = { "prettier" }, -- SQL sql = { "sql_formatter" }, mysql = { "sql_formatter" }, plsql = { "sql_formatter" }, -- Makefile (no formatter - they require tabs) -- make = {}, -- Fallback for all other filetypes ["_"] = { "trim_whitespace" }, }, -- Format on save format_on_save = function(bufnr) -- Disable for certain filetypes local ignore_filetypes = { "sql", "mysql", "plsql" } if vim.tbl_contains(ignore_filetypes, vim.bo[bufnr].filetype) then return end -- Disable with a global or buffer-local variable if vim.g.disable_autoformat or vim.b[bufnr].disable_autoformat then return end return { timeout_ms = 3000, lsp_fallback = true, } end, -- Formatter options formatters = { -- Stylua configuration stylua = { prepend_args = { "--indent-type", "Spaces", "--indent-width", "2" }, }, -- Prettier configuration prettier = { prepend_args = { "--tab-width", "2", "--single-quote" }, }, -- SQL formatter configuration sql_formatter = { prepend_args = { "--language", "postgresql" }, }, -- goimports configuration goimports = { prepend_args = { "-local", "github.com" }, }, }, }, init = function() -- Commands to toggle format on save vim.api.nvim_create_user_command("FormatDisable", function(args) if args.bang then -- FormatDisable! will disable formatting just for this buffer vim.b.disable_autoformat = true else vim.g.disable_autoformat = true end vim.notify("Autoformat disabled", vim.log.levels.INFO) end, { desc = "Disable autoformat-on-save", bang = true, }) vim.api.nvim_create_user_command("FormatEnable", function() vim.b.disable_autoformat = false vim.g.disable_autoformat = false vim.notify("Autoformat enabled", vim.log.levels.INFO) end, { desc = "Re-enable autoformat-on-save", }) vim.api.nvim_create_user_command("FormatToggle", function() vim.g.disable_autoformat = not vim.g.disable_autoformat if vim.g.disable_autoformat then vim.notify("Autoformat disabled", vim.log.levels.INFO) else vim.notify("Autoformat enabled", vim.log.levels.INFO) end end, { desc = "Toggle autoformat-on-save", }) end, }, }