VIM: 正确快速地保存未以sudo方式打开的那些“Read-only(只读)”文件

陪她去流浪 桃子 2015年06月29日 阅读次数:4717

有多少次你曾在用vim编辑并保存文件时因为权限问题被vim提示“文件只读”而无法保存文件?反正我是遇到过很多次了~

通常是这种情况。你打开一个文件,但忘记了加上sudo:

$ vim /etc/hosts

作一些改变,然后尝试保存并退出:

:wq

但有错误发生:

"/etc/hosts" E212: Can't open file for writing
Press ENTER or type command to continue

你便意识到这是一个只读权限的文件,于是你选择强制退出并重新编辑:

:q!
$ sudo vim /etc/hosts
:wq

如果聪明一点,你会先考虑把它保存到临时目录:

:w /tmp/foo

然后覆盖掉原来的文件:

sudo mv /tmp/foo /etc/hosts

但其实最好的办法应该是下面这样的:

:w !sudo tee % >/dev/null

这条命令是这样工作的(必须要懂管道命令):

  1. w命令把vim的标准输出(文件内容)作为tee命令的标准输入,并在当前shell中执行“sudo tee <当前文件名>”(%号在vim的命令中代表当前的文件名)

  2. (特权模式下的)tee把它的标准输入(文件内容)保存到以“%”标识的文件中。“>/dev/null”用于屏蔽掉tee的标准输出(文件内容的副本)

ok了,现在文件算是保存成功了,但由于是用外部命令保存的,vim应该会提示文件已发生改变并提示是否重新加载。现在退出vim,再以sudo方式重新打开文件即可。

这条命令比较长,由于开篇就提到这种没有以sudo方式执行vim的操作经常发生,所以要必要为此命令定义一个快捷命令。比如像下面这样:

cnoremap sudow w !sudo tee % >/dev/null

保存到 ~/.vimrc 之后,以后就可以用 :sudow 来代替前面复杂的命令了。

参考

这篇文章的内容已被作者标记为“过时”/“需要更新”/“不具参考意义”。

标签:vim