vscode无真正的只读模式开关,其只读行为完全依赖文件系统权限;设置文件为只读(windows属性勾选/unix chmod 444)后,vscode会显示?提示并禁用ctrl+s,但file→save as仍可用,因只读由os控制而非编辑器状态。

VSCode 没有真正的“只读模式”开关,但能通过文件系统权限 + 编辑器行为控制实现等效效果——关键不是找那个不存在的按钮,而是让编辑器“不敢改”、改了也“存不进去”。
为什么 File → Save As 还能保存?因为只读是文件属性,不是编辑器状态
VSCode 本身不维护“当前文件只读”这个内部标记。它只看操作系统返回的文件权限:如果 fs.stat(path).isFile() && !fs.accessSync(path, fs.constants.W_OK) 成立,编辑器会显示锁图标、禁用 Ctrl+S,但你仍可手动触发 File → Save As(另存为新文件)或粘贴覆盖内容后强行保存(此时会弹出权限错误)。真正生效的是底层文件系统是否允许写入。
- Windows 下右键文件 → “属性” → 勾选“只读” → 点确定
- macOS/Linux 执行
chmod 444 文件名(注意:别用644,那还是可写的) - VSCode 重启或重新打开该文件后,状态栏右侧会出现
? Read-only提示
workbench.editor.readonly 配置根本不存在,别搜这个关键词
网上很多教程说修改 settings.json 加 "workbench.editor.readonly": true,这是错的——VSCode 官方配置项里压根没有这个字段,加了也不生效,纯属误导。VSCode 的只读响应完全依赖文件系统反馈,不是靠设置驱动。
- 有效配置只有
"files.readonlyInclude": ["*.log", "config.example.yml"](按扩展名自动设只读) - 或
"files.readonlyExclude": ["**/temp/*.js"](排除某些路径) - 这些配置只是告诉 VSCode “遇到这类路径时主动调用
fs.access检查写权限”,不是强制设只读
用 editor.readonly API 写插件?太重,且用户不装插件就无效
如果你在开发插件,可以用 vscode.window.activeTextEditor?.document.isUntitled === false 判断是否已保存,再配合 vscode.workspace.fs.stat(uri).then(stat => (stat.permissions & vscode.FilePermission.Readonly) !== 0) 获取真实只读状态。但普通用户不需要、也不应该依赖插件来防误改。
- 插件无法阻止用户手动删掉文件只读属性再保存
- 插件不能拦截
Save As或外部工具(如命令行echo "xxx" > file.js)写入 - 真正可靠的防线永远在文件系统层:权限设对了,VSCode 自然老实
最常被忽略的一点:Git 仓库里的文件默认就是只读的(直到你 git checkout 或修改),但 VSCode 不会自动识别 Git 状态来禁用编辑——它只认 fs.access。所以别指望“刚 git pull 完就安全”,得手动设权限或靠 files.readonlyInclude 匹配 *.md 这类文档后缀。











