VIM: 正确快速地保存未以sudo方式打开的那些“Read-only(只读)”文件
有多少次你曾在用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
这条命令是这样工作的(必须要懂管道命令):
w命令把vim的标准输出(文件内容)作为tee命令的标准输入,并在当前shell中执行“sudo tee <当前文件名>”(%号在vim的命令中代表当前的文件名)
(特权模式下的)tee把它的标准输入(文件内容)保存到以“%”标识的文件中。“>/dev/null”用于屏蔽掉tee的标准输出(文件内容的副本)
ok了,现在文件算是保存成功了,但由于是用外部命令保存的,vim应该会提示文件已发生改变并提示是否重新加载。现在退出vim,再以sudo方式重新打开文件即可。
这条命令比较长,由于开篇就提到这种没有以sudo方式执行vim的操作经常发生,所以要必要为此命令定义一个快捷命令。比如像下面这样:
cnoremap sudow w !sudo tee % >/dev/null
保存到 ~/.vimrc 之后,以后就可以用 :sudow 来代替前面复杂的命令了。