好的,这种情况经常发生在我身上。肯定有更好的解决方案。假设你执行了vim /etc/somefile.conf
然后你按了 i
但是意识到你没有使用 sudo
权限,不能写入文件。然后我通过执行 :q
再执行 sudo !!
并再次进行更改来避免丢失我的更改。是否有更好的方法?
试一试
:w !sudo tee "%"
w !
取整个文件并将其传递给Shell命令。Shell命令是sudo tee
,它作为超级用户运行tee
。%
会被当前文件名替换。对于名称中包含空格或任何其他特殊字符的文件,需要使用引号。
sudo sh -c 'cat changed > file'
。请注意,cp和mv都将替换原始文件,并且其属性(所有权、权限、ACL)将丢失。除非您知道如何修复权限,否则不要使用它们。将文件保存到其他地方(比如你的主文件夹),然后使用sudo mv
命令覆盖原文件?
cat changed > file
来保留原始文件属性。对于此操作,使用 mv
是一种灾难性的做法。 - thkala我使用了这个:
function! SaveAsSudo()
let v=winsaveview()
let a=system("stat -c \%a " . shellescape(expand('%')))
let a=substitute(a,"\n","","g")
let a=substitute(a,"\r","","g")
call system("sudo chmod 666 " . shellescape(expand('%')))
w
call system("sudo chmod " . a . " " . shellescape(expand('%')))
call winrestview(v)
endfunction
我已将<F2>
映射到:w<CR>
,并将<F8>
映射到:call SaveAsSudo()<CR>
这个答案相对于sudo tee
选项的唯一优点是:vim
不会抱怨未保存的缓冲区或外部修改的文件。
将更改保存为另一个文件,然后进行适当的替换。
当Vim启动时,状态栏会显示[只读]
,当你第一次尝试进行编辑时,它会显示W10:警告:更改只读文件
,并暂停了整整一秒钟。这已经足够让我警觉并退出并输入sudoedit /etc/somefile.conf
。
您可以使用插件强制实现这一点:使缓冲区修改状态与文件只读状态匹配。
我使用zsh模板和函数完成。
具体来说是这个。如果我没有写入权限,它会提示我输入sudo密码并自动运行"sudo vim"……等等其他操作。
vim
中使用:e
或从(c)tags
中打开的。在那里,shell函数将无法帮助。 - anishsane
:w !sudo tee "%"
. - Victor Yarema