e45 错误是 vim 层面的只读标记(如 :set readonly 或文件 chmod -w),可用 :set noreadonly 解除;e212 才是系统级写权限不足,必须用 :w !sudo tee % 或 sudo vim 提权操作。

E45 错误不是权限问题,而是 Vim 自己设的只读标记;真正卡住你保存的,往往是 E212 —— 那才是系统级权限不足。 两种错误现象看起来相似,但解决路径完全不同,混用命令会白忙活。
区分 E45 和 E212:先看报错全文再动手
遇到保存失败时,别急着敲 :w! 或 :wq!。先确认终端显示的是哪条错误:
-
E45: 'readonly' option is set (add ! to override)→ Vim 主动加了readonly标记,通常因为文件本身是只读属性(chmod -w),或你手动执行过:set readonly -
E212: Can't open file for writing→ 文件存在,但当前用户无写权限(比如编辑/etc/hosts却没用sudo vim),:w!完全无效
前者靠 :set noreadonly 就能解;后者必须提权,否则所有 ! 都是摆设。
文件被 Vim 设为 readonly:用 :set noreadonly 解除
这种情况常见于:用 vim -R 打开、或编辑了 .sh 等脚本后 Vim 自动启用只读模式、又或者你手抖输过 :set readonly。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 按
Esc进入命令模式,输入:set noreadonly回车 - 再试
:w,应该能成功 - 如果还报 E45,检查是否文件系统挂载为只读(
mount | grep " $(df . | tail -1 | awk '{print $1}') ")
系统级权限不足(E212):用 :w !sudo tee % 强制落盘
这是最常被误判的场景:你编辑的是 /etc/hosts、/etc/fstab 等 root 文件,但启动 vim 时没加 sudo。此时 :w!、:wq! 全部失效。
- 确保在正常编辑状态下(不是可视模式),按
Esc,输入:w !sudo tee %回车 - 输入当前用户的
sudo密码(不显示字符,输完直接回车) - Vim 会提示
File has changed since last read; reload?,此时输入O(大写 O,表示 overwrite 缓冲区)继续编辑,或L刷新内容 -
%是 Vim 内置寄存器,自动展开为完整路径,不用手敲/etc/hosts,避免路径错误
加个快捷命令 w!!,省得每次输一长串
反复输入 :w !sudo tee % 很烦?可以映射成 w!!:
- 编辑
~/.vimrc,加入这行:cmap w!! w !sudo tee > /dev/null % - 注意是
cmap(命令行模式映射),不是nmap;> /dev/null是为了屏蔽tee输出的冗余字节数信息 - 执行
:source ~/.vimrc生效,之后只要输入:w!!回车即可 - 别用
:w !sudo sh -c "cat > '%'"—— 单引号在 Vim 命令行里容易被提前解析,有路径含空格时会崩
真正容易被忽略的点是:E45 和 E212 的底层原因不同,一个在 Vim 层,一个在系统层;用错命令不仅救不了文件,还会让你多按几次回车、多输几遍密码,甚至误以为 Vim 坏了。










