Answers:
诀窍是使用外部调用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此功能,但是也许我没有意识到一个窍门...
silent似乎工作正常?
w ! tee % > /dev/null 这仍然会回显命令的结果(单行),而不是整个缓冲区的内容。
tee,则不使用它然后丢弃它的输出,cat也行不通吗?
SuperWrite可以,但是它将文件回显给您。运行:silently会无形地输入密码。