LazyVim 如何用 :LazyFormatInfo 查看当前缓冲区生效的格式化器并控制自动格式化开关?
【免费下载链接】LazyVimNeovim config for the lazy项目地址: https://gitcode.com/GitHub_Trending/la/LazyVim
打开 LazyVim 后保存文件时,代码会被自动格式化,但缓冲区里到底有哪些格式化器在起作用、自动格式化当前是开还是关,很多时候并不直观。:LazyFormatInfo就是 LazyVim 提供的检查入口:它针对当前缓冲区列出全局/缓冲区两级自动格式化状态、每个已注册的格式化器及其实际解析到的源(formatter sources),并标出哪个是生效中的active项。配合<leader>uf/<leader>uF两个开关或vim.g.autoformat/vim.b.autoformat两个变量,你可以全局或按缓冲区地控制自动格式化。前提是你的 Neovim 已经在用 LazyVim 配置运行,并且当前打开的缓冲区有对应的格式化源(否则信息面板会直接提示没有可用格式化器)。
在目标缓冲区运行 :LazyFormatInfo
切换到你要检查的文件后,直接执行:
:LazyFormatInfo该命令在 format.lua 中注册,描述为 "Show info about the formatters for the current buffer"。输出是一个 Snacks 信息浮层,标题为LazyFormat (enabled)或LazyFormat (disabled),取决于当前缓冲区自动格式化是否生效。内容分两部分:
- Status 区:两行复选框,分别是
global和buffer两级状态。buffer一行的取值有三种:inherit(未设置缓冲区局部值,跟随全局)、enabled、disabled。 - 格式化器区:每个解析到至少一个源的格式化器单独列出,形如
# conform.nvim ***(active)***,其下每个解析到的源各占一行带[x]复选框;非激活的格式化器不带(active)标记。
如果当前缓冲区没有任何格式化源,面板会显示***No formatters available for this buffer.***。另外注意一个细节:状态行是[x]还是[ ]由M.enabled()判断,而浮层本身用LazyVim.info(启用时)或LazyVim.warn(禁用时)弹出,即自动格式化被禁用时提示会以警告样式呈现。
理解 global 与 buffer 两级开关的优先级
format.lua 中的M.enabled(buf)定义了判断逻辑:
- 若当前缓冲区设置了
vim.b[buf].autoformat(非 nil),以它为准; - 否则看全局
vim.g.autoformat;未设置(nil)时默认视为启用。
LazyVim 在 options.lua 中默认设置了vim.g.autoformat = true。也就是说:LazyFormatInfo里buffer: inherit时,实际状态由全局值决定;一旦你为某个缓冲区设置过vim.b.autoformat,该缓冲区就与全局值解耦。
控制自动格式化开关
临时切换:<leader>uf与<leader>uF
keymaps.lua 中定义了两个 Snacks toggle(LazyVim 的 leader 是空格):
<leader>uf "Auto Format (Global)" —— 切换 vim.g.autoformat <leader>uF "Auto Format (Buffer)" —— 切换 vim.b.autoformat两者都通过M.enable(enable, buf)实现(见 format.lua):
- 缓冲区切换时只写
vim.b.autoformat; - 全局切换时写
vim.g.autoformat,并把所有vim.b.autoformat重置为 nil,让缓冲区回到继承状态; - 每次切换后会自动再调一次
M.info(),即切完开关会立刻弹出更新后的:LazyFormatInfo面板,无需手动再查。
持久化配置:在配置中固定开关
NEWS.md 中给出的写法是按作用域设置变量:
vim.g.autoformat = false -- globally vim.b.autoformat = false -- buffer-local把它写进你自己的配置(例如config/options.lua)后,重启或重新 source 即生效。需要恢复时把对应值改回true或删除即可。
自动格式化何时真正执行
M.setup()注册了一条BufWritePreautocmd(augroup 名LazyFormat):保存文件前对当前缓冲区执行M.format({ buf = event.buf })。M.format的逻辑是:
- 未加
force且M.enabled(buf)为 false 时直接返回,不做任何格式化——这就是开关生效的位置; - 否则依次执行所有active的格式化器,单个格式化器报错会捕获并提示
Formatter `<name>` failed; - 没有任何 active 格式化器、且是以
force方式触发时,提示No formatter available(标题LazyVim)。
手动格式化用:LazyFormat命令,它以force = true调用M.format,即不受 autoformat 开关影响,始终格式化当前选区或整个缓冲区。验证自动格式化是否生效的完整链路:
:LazyFormatInfo确认buffer行为enabled或inherit且global为enabled;- 修改文件后写入(
:w),观察BufWritePre触发的格式化结果; - 切到
<leader>uf/<leader>uF后再次:LazyFormatInfo,确认状态行变化与预期一致; - 若想确认开关确实拦住了自动格式化,可在禁用状态下保存文件,文件应保持未格式化状态。
面板里会列出哪些格式化器
# <name>段落的来源是M.resolve(buf)遍历已注册的LazyFormatter。LazyVim 内置注册了:
conform.nvim(formatting.lua):
priority = 100、primary = true,源列表取自require("conform").list_formatters(buf)。它是 LazyVim 默认格式化器,且内置了formatters_by_ft:formatters_by_ft = { lua = { "stylua" }, fish = { "fish_indent" }, sh = { "shfmt" }, }所以在 lua、fish、sh 缓冲区里,
:LazyFormatInfo的 conform.nvim 段下应能看到对应源名。LSP formatter(lsp/init.lua 中
LazyVim.format.register(LazyVim.lsp.formatter())):同样是primary,源取决于当前可用的 LSP 服务器。
关于激活规则(NEWS.md):格式化器分primary(同一时间只有一个可激活,如 conform、none-ls、LSP)与secondary(多个可同时激活,如 eslint);LazyVim 根据当前可用源和优先级自动选择 primary。因此 conform.nvim 显示(active)时,其他 primary 格式化器即使有源也不会执行,只会在面板中列出。
验证与常见限制
- 看不到期望的格式化器:先确认对应工具已安装(conform 依赖 mason.nvim,由它管理安装);仍无源则面板会明确显示
No formatters available for this buffer.,此时保存也不会触发格式化,:LazyFormat会给出No formatter available警告。 - 不要给 conform.nvim 设置
format_on_save/format_after_save:LazyVim 的M.setup会主动清空这两个选项并提示 "Don't setopts.<key>forconform.nvim. LazyVim will use the conform formatter automatically",即保存时格式化统一由BufWritePreautocmd 驱动。同样,opts.format已废弃,应改用opts.default_format_opts。 - 不要替换 conform.nvim 的
plugin.config:LazyVim 会直接报错提示这会破坏 LazyVim 的格式化流程。 - none-ls 用户:
none-ls.nvim不再默认安装;若想继续用它,需启用lazyvim.plugins.extras.lsp.none-lsextra,否则 health.lua 相关的健康检查(M.health())会警告conform.nvim与nvim-lint已是默认,none-ls 需该 extra 才能正确参与格式化。 - 切换全局开关的副作用:如前所述,全局切换会把
vim.b.autoformat全部清空;若你依赖缓冲区级别的独立开关,切换全局值后需重新设置。
【免费下载链接】LazyVimNeovim config for the lazy项目地址: https://gitcode.com/GitHub_Trending/la/LazyVim
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考