Vim 编辑只读文件忘记加 sudo?三种提权保存完整解决方案

Vim 编辑只读文件忘记加 sudo?三种提权保存完整解决方案

_

一、vim编辑完后发现没有加上sudo

相信很多人都会遇到这个问题,当你习惯性对某个系统配置文件改了大半天,编辑结束后准备保存退出。结果vim提示你“readonly”。

E45: 'readonly' option is set (add ! to override)

vim对文件当前的修改是存储缓冲区,如果这个时候退出,则所有的改动消失。这个时候可能大家都开始头脑风暴,思考如何改变这个困境。可能会有一些非常规临时办法,如果当前是在某些远程SSH终端上,用鼠标将当前所有内容选择然后粘贴到记事本中保存。其实,vim也提供了几种解决方案去解决这个问题。

二、提权保存

1. 提权保存定义

提权保存不是vim单独内置的一键功能,但是将命令拆分,语法全是vim原生标准能力,只是搭配了Linux系统命令实现提权保存。

:w !sudo tee %
  • :w !{shell命令}:是vim原生自带语法,将当前缓冲区全部内容作为标准输入传递给后面的shell命令,属于标准过滤器写入能力

  • sudo tee :Linux标准命令

  • %:vim原生占位符,自动替换为当前打开文件的完整路径。vim的内置变量,无需第三方插件。

2. 提权保存示例

[Step1] 正常编辑内容,在底行模式下提权保存改动。

:w !sudo tee %

[Step2] 此时会出现W12警告信息,提示磁盘文件已变更、Vim缓冲区内容也有改动,Vim无法分清哪边为准,会弹出二选一提示。根源在于本次是借助tee外部命令提权写入磁盘,写入动作不会刷新vim自身的缓冲区状态标记。导致磁盘文件已更新,但是vim内存缓冲区与磁盘文件状态不一致。这里我们输入“L”重新从磁盘加载最新文件覆盖vim缓冲区。

W12: Warning: File "/etc/fstab" has changed and the buffer was changed in Vim as well
See ":help W12" for more info.
[O]K, (L)oad File:L

[Step3] 最后在底行模式正常退出即可。

:q

三、另存为其他文件

另存为其他文件本质是将当前编辑缓冲区里的全部内容,另存到一个全新文件,不会修改原打开的文件。

[Step1] 正常编辑内容,在底行模式下另存为到/tmp目录。

:w /tmp/fstab

[Step2] 另存为成功会显示另存为的行数和字节。

[Step3] 正常退出,然后查看另存为文件,可以看到文件内容与我们编辑的一致。

[meaauf@redhat ~]$ cat /tmp/fstab

四、经常提权的场景

日常工作中如果频繁需要root权限编辑文件,可以修改“~/.vimrc”配置自定义快捷指令,无需重新退出文件再用sudo打开,当忘记提权时直接一键保存。

[Step1] 编辑配置文件,写入提权命令。

[meaauf@redhat ~]$ vim ~/.vimrc
​
# 写入下列内容
cnoreabbrev w!! w !sudo tee % > /dev/null
  • cnoreabbrev:命令行简写,输入“w!!”会自动替换成后面自定义的指令

  • w!!:自定义触发词,输入“:w!!”即可触发

  • w !sudo tee % > /dev/null:提权保存,同时屏蔽W12警告信息

[Step2] 修改完配置文件后,可以在vim中指向下列命令使得配置文件生效。也可以关闭所有vim窗口,重新打开文件,配置文件会在启动时自动加载。

:source ~/.vimrc

[Step3] 验证:编辑文件,然后在底行模式中输入我们自定义的触发词。此时会弹出W12警告信息,输入“L”,最后输入“:q”退出即可。

:w!!
W12: Warning: File "/etc/fstab" has changed and the buffer was changed in Vim as well
See ":help W12" for more info.
[O]K, (L)oad File:L
:q

[Step4] 验证:查看配置文件可以看到已经正常修改。

[meaauf@redhat ~]$ cat /etc/fstab


Windows11关闭VBS的方法合集 2026-06-09

评论区