十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Vim 中运行 Prettier 后整个 buffer 被错误信息替换,怎么撤销并避免?

Vim 中运行 Prettier 后整个 buffer 被错误信息替换,怎么撤销并避免? Vim 中运行 Prettier 后整个 buffer 被错误信息替换怎么撤销并避免【免费下载链接】prettierPrettier is an opinionated code formatter.项目地址: https://gitcode.com/gh_mirrors/pr/prettier在 Vim 里通过自定义按键直接调用 Prettier 格式化当前 buffer 时如果代码本身存在语法错误Prettier 的输出不是格式化后的代码而是一条错误信息——而 Vim 的 filter 机制会把 buffer 内容整体替换成这条错误信息。本文基于 docs/vim.md 说明这个现象的触发条件、如何用u撤销以及如何改用文档推荐的插件路径来避开这个坑。先确认你的运行方式是不是“裸 filter”docs/vim.md 的 Running manually 一节给出了一种不带插件、只用按键映射的裸用法以gp为例在当前活动 buffer上运行 Prettiernnoremap gp :silent %!prettier --stdin-filepath %CR这条映射做两件事:!prettier ...是 filter 操作Prettier 的标准输出会整体替换buffer 内容--stdin-filepath %告诉 Prettier “stdin 内容来自当前文件名”这样 Prettier 能根据文件扩展名推断语言并加载对应配置。--stdin-filepath的定义见 docs/cli.md 的--stdin-filepath一节。文档对这个用法的注意事项原文是Note that if theres a syntax error in your code, the whole buffer will be replaced with an error message. Youll need to pressuto get your code back.也就是说“整个 buffer 被错误信息替换”是这种%!filter 方式特有的已知现象buffer 内容以 stdin 送入 Prettier解析失败时 Prettier 打印错误信息到 stdout而 filter 机制不区分“格式化结果”和“报错”一律用来覆盖 buffer。撤销按 u 恢复代码文档给出的恢复方法只有一个按u执行 undo代码就会回来。两点需要留意这条撤销路径依赖 Vim 的 undo 历史如果 buffer 内容在你按下gp之前从未被修改、也没有可撤销的历史u是否能恢复到错误覆盖前的内容以你本地 Vim 的 undo 行为为准同一节还指出这个方式的另一个缺点光标位置不会被保留the cursor position wont be preserved这是该用法的固有限制撤销与否都成立。避免改用文档推荐的插件路径docs/vim.md 开头就给出结论Vim 用户应安装 vim-prettier 的 Vim 一节同样把这几款插件作为官方推荐的集成方式并补充了 coc-prettier。用插件而非%!filter 调用 Prettier就不存在“stdout 整体覆盖 buffer”这条链路。前提是先按要求本地安装 Prettier。docs/install.md 要求锁定精确版本--save-exact文档中的版本号占位符%PRETTIER_VERSION%在生成文档时会替换为具体版本号你直接替换为你安装的版本即可例如npm install --save-dev --save-exact prettier3.9.0docs/editors.md 特别提醒每个项目都要本地安装 Prettier让编辑器插件拾取本地版本保证各项目使用正确版本。下面是文档给出的两个可选分支选其一即可。分支一Neoformat在.vimrc中用 vim-plug 安装Plug sbdchd/neoformat如果希望 Neoformat 使用项目本地的 Prettier即node_modules/.bin/prettier而不是$PATH上的prettier需要打开let g:neoformat_try_node_exe 1在受支持的文件中运行:Neoformat或显式指定 Prettier:Neoformat prettier想保存时自动格式化可加 autocommand文档示例以*.js为例autocmd BufWritePre *.js Neoformat文档还提到可以绑定更频繁的事件如TextChangedNormal mode 下文本变化后和InsertLeave离开 Insert mode 时autocmd BufWritePre,TextChanged,InsertLeave *.js Neoformat分支二ALEALE 依赖 Vim 8 或 Neovim 的异步能力。用 vim-plug 安装Plug dense-analysis/aleALE 会优先使用本地安装的 Prettier找不到才回退全局安装。为所用语言启用 Prettier fixerlet g:ale_fixers { \ javascript: [prettier], \ css: [prettier], \}然后在 JavaScript 或 CSS 文件中运行:ALEFix注意文档里的一个易踩的坑ALE 同时支持 linter 和 fixer如果没有限制 linters会对所有支持语言运行全部可用工具可能出现“格式正确但一堆 lint 报错”的情况。只运行显式配置的 linter 需设置let g:ale_linters_explicit 1保存时自动格式化let g:ale_fix_on_save 1如何判断已经生效文档给出的验证方式就是运行命令后检查 buffer:Neoformat、:Neoformat prettier或:ALEFix执行后buffer 内容变为 Prettier 格式化后的代码且不再有错误信息覆盖。若 buffer 仍出现报错按文档逻辑回到根因——先修掉代码里的语法错误Prettier 解析成功后输出才会是格式化结果。限制“buffer 被错误信息替换”仅出现在%!filter 这种手动运行方式撤销手段是u该方式还会丢失光标位置这是文档明确列出的第二个缺点Prettier 选项也可以直接写进.vimrc如 ALE 的g:ale_javascript_prettier_options --single-quote --trailing-comma allNeoformat 的formatprg中每个空格都要用\转义但文档建议优先使用 配置文件。【免费下载链接】prettierPrettier is an opinionated code formatter.项目地址: https://gitcode.com/gh_mirrors/pr/prettier创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表