Skip to content

conform.nvim

我的电脑上保存了 nvim 和 nvim-from-scratch 两套 Neovim 配置,前者用于主力生产,后者用于学习新知。在 Teek 目录下,使用任何一套 Neovim 配置,在编辑 Markdown 时,均可实现在保存时自动格式化。然而,在其他的普通目录下,比如编辑 ~/Documents/Weekly.md 或者 ~/AppData/Local/nvim-from-scratch/README.md,Markdown 文件却无法在保存时自动格式化,并在状态栏抛出 Formatters unavailable for markdown file 报错信息。

那么,Teek 目录与其他目录正比,多了什么配置?检查 node_modules 目录,会发现 prettier, vitepress,vitepress-theme-teek 三个项目依赖。

所以,可以推断问题的原因在于:Teek 项目下安装了一个局域的 prettier,而其他目录下没有类似的局域的 prettier 依赖,并且没有安装全局的 prettier 依赖。恰好 5 月初新装电脑,很多工具尚未全部重新安装完毕。全局安装 prettier 即是漏网之鱼。

You can check which npm modules have been installed globally by using the following command:

sh
npm list -g --depth=0
C:\Users\Lenovo\AppData\Roaming\npm
+-- pnpm@10.10.0
`-- tree-cli@0.6.7

Explanation

  • -g → Lists globally installed packages.
  • --depth=0 → Shows only top-level packages (without dependencies).

可以看出,npm 全局并未安装 prettier 依赖。解决问题的办法在于,先全局安装 prettier,再调整 conform.nvim 插件的配置,使其:既能格式化位于【项目目录】下的 Markdown 文件,也能够格式化位于【其他目录】的 Markdown 文件。

  1. 安装 global prettier
    sh
    npm install --global prettier
  2. 调整 conform.nvim 配置文件:检测并优先使用 local prettier,若未找到 local prettier 则回调使用 global prettier
    lua
    return {
    	"stevearc/conform.nvim",
    	opts = {
    		formatters_by_ft = {
    			javascript = { "prettierd", "prettier", stop_after_first = true },
    			typescript = { "prettier" },
    			javascriptreact = { "prettier" },
    			typescriptreact = { "prettier" },
    			css = { "prettier" },
    			html = { "prettier" },
    			vue = { "prettier" },
    			json = { "prettier" },
    			yaml = { "prettier" },
    			markdown = { "prettier" },
    			lua = { "stylua" },
    			python = { "isort", "black" },
    		},
    		format_on_save = {
    			timeout_ms = 500,
    			lsp_format = "fallback",
    		},
    		-- You can adjust conform.nvim to use either a local prettier
    		-- (if available in the project's `node_modules`),
    		-- or fallback to global prettier if the local version isn't found.
    		formatters = {
    			prettier = {
    				command = function()
    					local local_prettier = vim.fn.findfile("node_modules/.bin/prettier", vim.fn.getcwd() .. ";")
    					if local_prettier ~= "" then
    						return "./" .. local_prettier -- Use project-local Prettier
    					end
    					return "prettier" -- Use global Prettier if local doesn't exist
    				end,
    				args = function()
    					local local_config = vim.fn.findfile(".prettierrc", vim.fn.getcwd() .. ";")
    					if local_config ~= "" then
    						return { "--config", local_config, "--stdin-filepath", "$FILENAME" }
    					end
    					return {
    						"--config",
    						vim.fn.expand("~/.config/prettier/.prettierrc"),
    						"--stdin-filepath",
    						"$FILENAME",
    					}
    				end,
    			},
    		},
    	},
    }
  3. 由于 Teek 项目已经安装 local prettier(位于根目录 node_modules 文件夹),于是在根目录下创建一个 .prettierrc 文件,写入相关规则,仅适用于本项目内的 Markdown 文件格式化
    json
    {
     "proseWrap": "preserve",
     "printWidth": 130,
    }
  4. 创建 global pretter 的配置文件 ~/.config/prettier/.prettierrc,内部规则将适用于其他文件夹内的 Markdown 文件格式化
    json
    {
     "proseWrap": "always",
     "printWidth": 80,
    }

建议先对 local 和 global 的两份 .prettierrc 配置文件设置相反的规则,先行测试, 再行部署。如此,Neovim + conform.nvim 编辑普通文件夹下 Markdown 文档遇到的 Formatters unavailable for markdown file 报错可得到完美解决。

最近更新