好的,所以这一切都发生在我身上。必须有一个更好的解决方案。假设您执行vim /etc/somefile.conf
,然后执行i
,但发现您不是sudo
而且您无法写信。因此,我通过:q
然后sudo !!
丢失了我的更改并再次进行更改。有更好的方法吗?
答案 0 :(得分:32)
尝试
:w !sudo tee %
w !
获取整个文件并将其传递给shell命令。 shell命令是sudo tee
,以超级用户身份运行tee
。 %
将替换为当前文件名。
答案 1 :(得分:1)
将文件保存在其他位置(例如您的主文件夹),然后sudo mv
将其覆盖原始文件?
答案 2 :(得分:0)
将更改另存为另一个文件并进行适当的放置。
答案 3 :(得分:0)
当vim启动时,状态栏会显示[readonly]
,当您第一次尝试编辑时,会显示W10: Warning: Changing a readonly file
并暂停一整秒。这足以让我退出并说出sudoedit /etc/somefile.conf
。
您可以使用插件强制执行此操作:Make buffer modifiable state match file readonly state。
答案 4 :(得分:0)
根据更改的范围,使用其他名称保存(:w
)文件可能会更快,然后使用sudo
和cat
覆盖原始文件的内容:
sudo sh -c 'cat changed > file'
请注意,cp
和mv
都将替换原始文件,其属性(所有权,权限,ACL)将丢失。 不要使用,除非您知道如何修复权限。
答案 5 :(得分:0)
我使用zsh模板和功能完成。
特别是this one。如果我没有写入权限,它会提示输入我的sudo密码并自动运行“sudo vim”...等等。
答案 6 :(得分:0)
我用过这个:
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
不会抱怨未保存的缓冲区或外部修改的文件。