这也很有效:
:w !sudo sh -c "cat > %"
这是受@Nathan Long评论的启发。
的 注意 强> :
" 必须用来代替 ' 因为我们想要 % 在传递给shell之前进行扩展。
"
'
%
接受的答案涵盖了所有内容,所以我将再举一个例子 的 捷径 强> 我用的,用于记录。
把它添加到你的 etc/vim/vimrc (要么 ~/.vimrc ):
etc/vim/vimrc
~/.vimrc
cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!
哪里:
cnoremap
w!!
execute '...'
silent!
write !sudo tee % >/dev/null
NULL
<bar> edit!
edit
<bar>
希望能帮助到你。另见其他问题:
在执行的命令行中, % 代表着 的 当前文件名 强> 。这是记录在案 :help cmdline-special :
:help cmdline-special
In Ex commands, at places where a file name can be used, the following characters have a special meaning. % Is replaced with the current file name.
正如你已经发现的那样, :w !cmd 将当前缓冲区的内容传递给另一个命令。什么 tee 将标准输入复制到一个或多个文件,还复制到标准输出。因此, :w !sudo tee % > /dev/null 有效地将当前缓冲区的内容写入当前文件 的 虽然是根 强> 。可以用于此的另一个命令是 dd :
:w !cmd
tee
:w !sudo tee % > /dev/null
dd
:w !sudo dd of=% > /dev/null
作为快捷方式,您可以将此映射添加到您的 .vimrc :
.vimrc
" Force saving files that require root permission cnoremap w!! w !sudo tee > /dev/null %
有了上面你可以输入 :w!!<Enter> 以root身份保存文件。
:w!!<Enter>
:w - 写一个文件。
:w
!sudo - 调用shell sudo命令。
!sudo
tee - 使用tee重定向的write(vim:w)命令的输出。 %只是当前文件名,即/etc/apache2/conf.d/mediawiki.conf。换句话说,tee命令以root身份运行,它接受标准输入并将其写入由%表示的文件。但是,这将提示再次重新加载文件(点击L加载vim本身的更改):
教程链接
我想建议另一种方法 “Oups我忘了写 sudo 打开我的文件“ 问题:
sudo
而不是接收 permission denied 并且必须输入 :w!! ,我发现有条件的更优雅 vim 这样的命令 sudo vim 如果文件所有者是 root 。
permission denied
:w!!
vim
sudo vim
root
这很容易实现(甚至可能有更优雅的实现,我显然不是bash-guru):
function vim(){ OWNER=$(stat -c '%U' $1) if [[ "$OWNER" == "root" ]]; then sudo /usr/bin/vim $*; else /usr/bin/vim $*; fi }
它的效果非常好。
这是一个更多 bash 以中心的方式比 vim - 所以不是每个人都喜欢它。
bash
当然:
tail
cat
但我发现这会带来更好的效果 的 开发用户体验 强> ,这是恕我直言,使用时往往会被遗忘的东西 bash 。 :-)