根本原因是保存流程被拦截或拒绝,而非vscode故障;需按编辑器层(文件权限)、格式化层(prettier/eslint冲突)、语言服务层(volar/vetur等插件钩子)三级排查,eacces类错误优先检查属主与写权限,wsl下必须用remote-wsl打开,files.readonly对settings.json无效。

Ctrl+S 保存时弹出错误提示或静默失败
根本原因不是 VSCode 坏了,而是保存流程被某个环节拦截或拒绝。常见错误信息如 EACCES: permission denied、Failed to save 'settings.json': Insufficient permissions 或保存后立刻报 ESLint/Prettier 冲突错误,都指向具体可查的链路节点。
-
EACCES类错误:直接检查文件系统权限。Linux/macOS 运行ls -l ~/.config/Code/User/settings.json,若属主是root,执行sudo chown -R $USER:$GROUPS ~/.config/Code/User/;再确认写权限:chmod u+w ~/.config/Code/User/settings.json - Windows 下右键
settings.json→ 属性 → 取消勾选“只读”→ 应用 - WSL 用户必须用
Remote-WSL: New Window打开编辑器,否则通过\wsl$路径编辑会绕过 POSIX 权限校验,chmod和chown全部失效 -
files.readonly配置对settings.json完全无效,别往这个方向折腾
保存时 ESLint 报红或自动修复失败
这是「格式化」和「校验」两个动作打架的结果:Prettier 按双引号格式化完,ESLint 立刻发现单引号缺失,于是标红或报错。它不发生在所有文件上,只在你启用了 editor.formatOnSave 且同时配置了 ESLint 自动修复时触发。
- 最简解法:关掉自动格式化,只留自动修复 —— 在
settings.json中设"editor.formatOnSave": false,同时开启"editor.codeActionsOnSave": { "source.fixAll": true } - 若必须保留格式化,统一引号规则:在
.prettierrc中加"singleQuote": true,并在.eslintrc.js中确保quotes: ["error", "single"]未被覆盖 - Vetur 用户注意:
vetur.format.defaultFormatter.js设为"vscode-typescript"可避免 JS 部分被 Prettier 强制改双引号
Vue 文件保存后 HTML 被移到文件底部
这不是 bug,是 Vetur 或 Prettier 对 <template></template> 的解析策略问题。它们默认把整个 <template></template> 当作 HTML 片段处理,一旦结构不规范(比如标签未闭合、属性换行混乱),就可能重排顺序,甚至把内容“推”到文件末尾。
- 先验证结构:确保
<template></template>、<script></script>、<style></style>三块严格分离,且各自内部语法合法(可用vue-eslint-parser校验) - 临时禁用 Vue 格式化:
"[vue]": { "editor.formatOnSave": false } - 若坚持格式化,Vetur 用户需显式禁用 HTML 部分:
"vetur.format.defaultFormatter.html": "none",Prettier 用户加"vueIndentScriptAndStyle": true到.prettierrc - 别信“重装插件能解决”,90% 情况是配置叠加导致行为不可预测,而不是插件本身损坏
Ctrl+S 后右下角一直转圈或代码闪动
这是某插件在保存钩子中卡死或反复触发导致的 UI 假死。典型表现是仅在特定文件类型(如 .vue 或 .ts)下发生,切换 Tab 就恢复,重启窗口也不彻底——说明状态没清干净。
- 启动安全模式验证:
code --disable-extensions,再试 Ctrl+S。若正常,说明扩展冲突 - 重点排查:Volar(Vue 3)、Vetur(Vue 2)、ESLint、Prettier、Auto Rename Tag、Import Sorter —— 这些插件都注册了保存时 hook
- 逐个禁用时,注意关闭对应语言服务:比如禁用 Volar 后,还要检查设置里
vue.server.hybridMode是否为false,否则后台进程仍在运行 - 不要依赖“重装 VSCode”,缓存和扩展状态不会被卸载命令清除;真正有效的是删掉
~/.vscode/extensions目录(Linux/macOS)或%USERPROFILE%\.vscode\extensions(Windows)再重装











