vscode无“一键锁定只读”按钮,真正只读需系统权限(chmod 444/windows属性勾选)与files.readonlyinclude配置双重绑定:前者拦截写入,后者禁用编辑+保存;若仅显示“read-only”却可ctrl+s成功,是因files.savewithoutwatching未关闭或系统权限未设。

VSCode 没有“当前文件一键锁定为只读”的按钮,所谓“锁定”,本质是让编辑器拒绝保存 + 让操作系统拒绝写入——两者缺一不可。
为什么右下角显示 “Read-only” 却还能 Ctrl+S 成功?
这是最常被误判的信号。VSCode 只在满足以下任一条件时显示该提示:
- 文件系统权限为只读(
chmod 444或 Windows 属性勾选“只读”) -
files.readonlyInclude配置命中了该文件路径
但仅显示提示 ≠ 真正锁定。如果 files.saveWithoutWatching 仍为 true(默认值),VSCode 会跳过只读检查直接尝试写入;若此时文件系统又恰好允许写(比如你忘了设 chmod 444),保存就静默成功了。
验证是否真生效:关闭该文件标签页 → 重新打开 → 按 Ctrl+S,必须弹出 Unable to write file 'xxx' (NoPermissions) 才算到位。
如何真正禁用编辑+保存(不只是视觉提示)
files.readonlyInclude 是 VSCode 1.80+ 唯一有效的只读配置项,它能灰掉编辑区、禁用 Ctrl+S、加水印,但不阻止粘贴覆盖内容——用户仍可输入、删改,只是点保存时才拦截。
要彻底禁用编辑行为,必须叠加系统级只读:
- Windows:右键文件 → “属性” → 勾选“只读” → 点“应用”,并勾选“将更改应用于此文件夹、子文件夹和文件”
- macOS/Linux:终端执行
chmod 444 /path/to/your/file.ts(注意不是644)
此时 VSCode 会自动进入“强只读”状态:光标不可定位、无法输入、Ctrl+A 全选后 Del 无效,右下角锁图标变实心 ?。
工作区设置中怎么写 files.readonlyInclude 才匹配单个当前文件?
它不支持“当前文件”动态变量,只能靠路径 glob 匹配。想锁定刚打开的 src/core/auth.ts,需在项目根目录下的 .vscode/settings.json 中写:
"files.readonlyInclude": {
"**/src/core/auth.ts": true
}
关键细节:
- 路径基于工作区根目录,不是绝对路径
- 必须用双星号
**/开头,否则不匹配 - 改完后必须关闭所有已打开的
auth.ts标签页,再重新打开才生效(不会热更新) - 别用
files.readonly—— 这个字段已在 1.80+ 版本中被完全移除,写了也无效
Git 仓库里刚 pull 下来的核心文件,为什么没自动只读?
Git 默认不保留文件权限位(尤其在 Windows/macOS 上),git checkout 后,即使原文件是 444,本地也会变成 644。VSCode 只看当前磁盘权限,自然不触发只读。
解决办法只有两个:
- 手动对关键文件重复执行
chmod 444(适合少量文件) - 在仓库根目录运行
git config core.filemode false,让 Git 忽略权限变更,之后你设一次444就长期有效
注意:files.readonlyInclude 对 Git 状态无感知,它只认路径,不认 Git 是否 clean。
真正防手滑的底线从来不在编辑器设置里,而在 chmod 444 和 files.readonlyInclude 的双重绑定上——前者让 OS 拦截写入,后者让 VSCode 拦截操作。少一层,就多一个绕过路径。











