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

:w!在这种情况下显然失败,因为我的用户无论如何都没有写许可。因此,我必须:w /home/filename,exit和sudo mv ...,非常不舒服。

是否有办法暂时升级到root才能保存当前打开的
文件? (如果我在sudoers中或/并且我可以直接在su中)?

#1 楼

诀窍是使用对sudo的外部调用:

:w !sudo tee %


工作原理:



:w !<command>执行

<command>将stdin复制到文件&stdout; tee扩展为当前文件名。.
您以%前缀作为根权限。覆盖您正在编辑的文件的内容。这就是为什么您会从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>


通过sudo,只有root用户才能使用su立即执行命令。我认为您无法使用-c来执行此操作,但是也许我没有意识到一个窍门...

评论


SuperWrite可以运行,但是会回显您的文件。运行它:静默地输入密码。

–TankorSmash
2015年2月23日在23:38

@TankorSmash谢谢;更新的答案。但是,不确定“隐式输入密码”是什么意思?添加静音似乎可以正常工作?

–马丁·图尔诺伊(Martin Tournoij)
2015年2月23日在23:41



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

–TankorSmash
15年2月24日在4:52

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

–乔恩·卡特(Jon Carter)
2015年2月24日在7:01



如果您不希望打印文件,则不使用tee然后丢弃其输出,猫也不会工作吗?

– Lie Ryan
15年2月26日在11:08

#2 楼

我在.vimrc文件中使用了以下映射,这些映射对我很有用: “”和“ w”是“超强力写入”。 :P

评论


我早已将其映射到W,但是w!更有意义,应更新我的.vimrc。谢谢

–贾兰布
2015年2月6日下午0:17