Vim 优雅的强制写入只读文件

Published: 2022-10-31

Tags: Vim

本文总阅读量

在 Linux 下用 vim 编辑只读配置文件,保存时提示没有权限,需要退出编辑并使用 sudo 命令重新打开,比较麻烦,在网上冲浪无意间看到解决办法,记录如下。

似乎可以使用 :w! 保存,但这种方式会导致文件所有者和所属组变为当前用户。

这是因为 vim 在编辑文件时会创建一个属于当前用户(ubuntu)的 .swp 文件,使用 :w! 强制保存就相当于用临时文件覆盖掉了原文件,导致原文件的所属用户/所属组发生变化,这通常不符合预期。

正确的方式是执行如下命令

:w !sudo tee %

如上 vim 命令中 :w !cmd 的意思是将当前 buffer 中的数据通过 cmd 命令来处理,例如 :w !cat 命令就是将当前 buffer 的内容通过 cat 命令打印到终端。 % 号代表着当前文件的文件名,tee 命令用于显示程序的输出并将其复制到一个文件中,sudo 用于赋予 tee 命令权限,那么连起来的意思就是将 buffer 内容写入到当前文件中。

为了便于使用,可以将命令保存到 ~/.vimrc,后续使用 vim 强制保存文件时输入 :w!! 时会自动将命令补全。

cmap w!! w !sudo tee > /dev/null %

参考