From a282113ccfae2e51875c468e9e954fc19f47d1b5 Mon Sep 17 00:00:00 2001 From: xfy Date: Thu, 28 May 2026 11:22:05 +0800 Subject: [PATCH] Add conform.nvim for auto-formatting Co-Authored-By: Claude Opus 4.7 (1M context) --- lua/lsp.lua | 45 ++++++++++++++++++++++++++++++++++++++++++++- lua/pack.lua | 1 + nvim-pack-lock.json | 4 ++++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/lua/lsp.lua b/lua/lsp.lua index 14615f0..d2a2f5d 100644 --- a/lua/lsp.lua +++ b/lua/lsp.lua @@ -1,5 +1,45 @@ local lazy = require("lazy") +-- conform.nvim - BufWritePre 懒加载 +local function setup_conform() + local function biome_or_prettier() + if vim.fs.find({ "biome.json", "biome.jsonc" }, { upward = true, stop = vim.uv.os_homedir() })[1] then + return { "biome-check", "biome", stop_after_first = true } + end + return { "prettier" } + end + + require("conform").setup({ + formatters_by_ft = { + lua = { "stylua" }, + go = { "gofumpt", "goimports" }, + javascript = biome_or_prettier, + typescript = biome_or_prettier, + javascriptreact = biome_or_prettier, + typescriptreact = biome_or_prettier, + json = biome_or_prettier, + css = { "prettier" }, + html = { "prettier" }, + markdown = { "prettier" }, + toml = { "taplo" }, + }, + format_on_save = function(bufnr) + if vim.b[bufnr].autoformat == false or vim.g.autoformat == false then + return nil + end + return { timeout_ms = 500, lsp_fallback = true } + end, + }) +end + +lazy.on_event("conform", "BufWritePre", "*", function(args) + setup_conform() + -- 首次保存时手动触发格式化(setup 注册的 autocmd 不会在同一次事件中生效) + if vim.b[args.buf].autoformat ~= false and vim.g.autoformat ~= false then + require("conform").format({ bufnr = args.buf, timeout_ms = 500, lsp_fallback = true }) + end +end) + -- mason + LSP 配置延迟到 VimEnter,避免启动时加载 lazy.on_event("lsp", "VimEnter", "*", function() require("mason").setup() @@ -34,7 +74,10 @@ end) -- LSP keymaps vim.keymap.set("n", "gd", vim.lsp.buf.definition, { desc = "Go to definition" }) vim.keymap.set("n", "gh", vim.lsp.buf.hover, { desc = "Hover" }) -vim.keymap.set("n", "fm", vim.lsp.buf.format, { desc = "Format Local buffer" }) +vim.keymap.set("n", "fm", function() + lazy.load("conform", setup_conform) + require("conform").format({ lsp_fallback = true }) +end, { desc = "Format buffer" }) vim.keymap.set("n", "df", vim.diagnostic.open_float, { desc = "Show line diagnostics" }) vim.keymap.set("n", "ca", vim.lsp.buf.code_action, { desc = "Code action" }) diff --git a/lua/pack.lua b/lua/pack.lua index 5d4ccff..ddd0b28 100644 --- a/lua/pack.lua +++ b/lua/pack.lua @@ -6,6 +6,7 @@ vim.pack.add({ { src = "https://github.com/nvim-treesitter/nvim-treesitter", branch = "main" }, "https://github.com/neovim/nvim-lspconfig", "https://github.com/mason-org/mason.nvim", + "https://github.com/stevearc/conform.nvim", "https://github.com/tpope/vim-fugitive", }) diff --git a/nvim-pack-lock.json b/nvim-pack-lock.json index 02725f1..3e43eac 100644 --- a/nvim-pack-lock.json +++ b/nvim-pack-lock.json @@ -1,5 +1,9 @@ { "plugins": { + "conform.nvim": { + "rev": "619363c30309d29ffa631e67c8183f2a72caa373", + "src": "https://github.com/stevearc/conform.nvim" + }, "friendly-snippets": { "rev": "6cd7280adead7f586db6fccbd15d2cac7e2188b9", "src": "https://github.com/rafamadriz/friendly-snippets"