如何在Neovim中用mason和lsp-zero配置YAML格式化工具
解决YAML格式化不生效的配置方案
问题根源分析
Golang的gopls本身集成了格式化能力,且lsp-zero默认启用LSP的格式化功能,因此保存.go文件时自动生效。而yamlls默认不提供格式化能力,你安装的yamlfmt是独立工具,需要通过null-ls桥接至Neovim的自动格式化流程才能生效。
具体配置步骤
1. 安装依赖插件
添加null-ls.nvim和mason-null-ls.nvim,用于关联Mason管理的工具与Neovim的LSP生态:
-- 以packer.nvim为例,其他插件管理器可对应调整 use { 'jose-elias-alvarez/null-ls.nvim', requires = {'nvim-lua/plenary.nvim'}, } use 'jay-babu/mason-null-ls.nvim'
2. 配置Mason关联yamlfmt
修改mason.lua,添加mason-null-ls配置,自动注册yamlfmt和yamllint:
require('mason-tool-installer').setup { ensure_installed = { -- 保留你原有的工具列表... 'yamllint', 'yamlfmt', 'yamlls', -- 其他工具... } } -- 新增mason-null-ls配置 require('mason-null-ls').setup({ automatic_installation = true, handlers = { yamlfmt = function(source_name, methods) local null_ls = require('null-ls') null_ls.register(null_ls.builtins.formatting.yamlfmt) end, yamllint = function(source_name, methods) local null_ls = require('null-ls') null_ls.register(null_ls.builtins.diagnostics.yamllint) end, }, })
3. 调整lsp-zero配置,启用自动格式化
修改lsp.lua,禁用yamlls的格式化能力,添加保存自动格式化逻辑:
local lsp = require("lsp-zero") lsp.preset("recommended") -- Fix Undefined global 'vim' lsp.nvim_workspace() -- 新增:禁用yamlls的格式化,避免与yamlfmt冲突 lsp.configure('yamlls', { capabilities = { documentFormattingProvider = false, }, }) -- 你的原有cmp配置... lsp.set_preferences({ suggest_lsp_servers = false, sign_icons = { error = 'E', warn = 'W', hint = 'H', info = 'I' } }) lsp.on_attach(function(client, bufnr) local opts = {buffer = bufnr, remap = false} -- 你的原有快捷键映射... -- 新增:保存前自动格式化 vim.api.nvim_create_autocmd('BufWritePre', { buffer = bufnr, callback = function() vim.lsp.buf.format({async = false}) end, }) end) vim.diagnostic.config({ virtual_text = true }) -- 新增:初始化null-ls local null_ls = require('null-ls') null_ls.setup({ on_attach = lsp.get_on_attach(), }) lsp.setup()
4. 验证配置
- 打开YAML文件,执行
:NullLsInfo,检查yamlfmt是否已注册为格式化源 - 保存文件,确认内容是否自动格式化
额外配置(可选)
如果yamlfmt的默认格式不符合需求,可通过参数自定义规则:
null_ls.builtins.formatting.yamlfmt.with({ extra_args = {'-config', '~/.yamlfmt'}, -- 指定自定义配置文件路径 })
内容的提问来源于stack exchange,提问作者Kingindanord
相关产品推荐
相关产品推荐

