如何保存我没有写权限的文件?


26

有时,我会以自己的用户身份打开文件并进行一些修改,而没有注意到或“忘记” [read-only]状态行中的警告(/etc例如,一些随机配置文件/etc/resolv.conf)。

:w!显然在这种情况下会失败,因为我的用户仍然没有写权限。所以我必须:w /home/filename离开,而且sudo mv ...非常不舒服。

有没有一种方法可以让我临时升级为root以便能够保存当前打开的文件?(假设我在sudoers或/并且我可以su直接进入)?

Answers:


24

诀窍是使用外部调用sudo

:w !sudo tee %

工作原理:

  • :w !<command>执行<command>与缓冲作为标准输入的内容。
  • tee将stdin复制到文件&stdout; %扩展为当前文件名。
  • 您在此前缀以sudo获取root权限。

您并不是真正用Vim保存文件,而是调用一个外部程序来覆盖正在编辑的文件的内容。这就是为什么您会收到Vim警告的原因:

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

您可以将其变成一个函数:

fun! SuperWrite()
        write !sudo tee %
        " Or with :silent (but that doesn't seem to work for everyone)
        "silent write !sudo tee %
        edit!
endfun

和keybind:

nnoremap <Leader>w! :call SuperWrite()<CR>

使用su,只有root用户可以使用-c立即执行命令。我认为您无法使用su此功能,但是也许我没有意识到一个窍门...


SuperWrite可以,但是它将文件回显给您。运行:silently会无形地输入密码。
TankorSmash 2015年

@TankorSmash谢谢;更新的答案。但是,不确定“隐式输入密码”是什么意思?添加silent似乎工作正常?
马丁·图尔诺伊

我没有使用sudo运行vim,所以可能在这里发挥作用,但是当我去sudo tee文件时,它会提示我输入sudo密码。如果静音,则看不到提示,但仍需要输入密码。
TankorSmash

1
您将看到tee的标准功能,即回显到stdout以及给定的文件。一种解决方案是将stdout重定向到/ dev / null,例如: w ! tee % > /dev/null 这仍然会回显命令的结果(单行),而不是整个缓冲区的内容。
乔恩·卡特

如果您不希望打印文件tee,则不使用它然后丢弃它的输出,cat也行不通吗?
Lie Ryan

12

我在我的.vimrc中使用了以下映射,这对我很有用:

cnoremap w!! w !sudo tee %

容易记住,因为它w是“写”,w!是“强制写”,并且w!!是“超双重强制写”。:P


1
我早就将它映射到了W,但是w!!更有意义的是,将更新我的.vimrc。谢谢
jalanb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.