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:
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 文件。
- 安装 global prettiersh
npm install --global prettier
- 调整 conform.nvim 配置文件:检测并优先使用 local prettier,若未找到 local prettier 则回调使用 global prettierlua
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, }, }, }, }
- 由于 Teek 项目已经安装 local prettier(位于根目录
node_modules
文件夹),于是在根目录下创建一个.prettierrc
文件,写入相关规则,仅适用于本项目内的 Markdown 文件格式化json{ "proseWrap": "preserve", "printWidth": 130, }
- 创建 global pretter 的配置文件
~/.config/prettier/.prettierrc
,内部规则将适用于其他文件夹内的 Markdown 文件格式化json{ "proseWrap": "always", "printWidth": 80, }
建议先对 local 和 global 的两份 .prettierrc
配置文件设置相反的规则,先行测试, 再行部署。如此,Neovim + conform.nvim 编辑普通文件夹下 Markdown 文档遇到的 Formatters unavailable for markdown file
报错可得到完美解决。