to be
a problem slover

vim强制保存命令:w !sudo tee %详解

概述

使用 vim 编辑文件时,如果权限不够,提示readonly,不让你保存,会很烦人,如果这时候退出辛辛苦苦的编辑就白费了

幸运的是可以在不退出当前vim的情况下,使用命令:w !sudo tee %命令来强制保存,这个一般对vim熟悉的同学都知道

但是这个命令背后的原理你知道吗?

其实背后的知识还真不少

本文将把这条命令逐一拆解,让你一次性搞个明白!

:w – 保存 buffer

w的作用是保存当前文件缓存到指定的文件,要深刻理解这句话

查看 vim 帮助:help :w

w for write, Write the whole buffer to the current file.

:w = :w current_file,单独使用时,作用为将文件buffer保存在当前文件中
:w another_file, 将文件buffer保存到另一个文件中,当前文件不改变,效果就是另存为
:w ![cmd], 将文件buffer作为输入交给 shell 命令处理

sudo – 使用管理员权限执行命令

sudo的作用是用来获取管理员权限

因为当前用户没有写权限,所以单独用:w是不能保存文件的

只有通过 sudo 提升权限,再执行tee命令才能将当前缓存保存到原文件名下

tee – 管道分支

tee意为 T 字形的

tee的作用是管道分支,比如echo "hello" | tee file.txt,作用是将”hello”这段标准输入,保存到file.txt同时打印到标准输出(屏幕)中

又如ls -l | tee file.txt | less命令,tee将上一个命令的输出一方面写入file.txt中,另一方面继续传递给less命令

% – 当前文件路径寄存器

%是 vim 的一个 read only 寄存器,它储存着当前文件的绝对路径

可以在 vim 命令模式下这么测试一下 – 输出当前文件名

:!echo %

退出 vim 会看到 terminal 会打印出当前文件的路径

强制保存后的警告

执行完这个:w !sudo tee %命令,内容就强制保存了,但是会出一个警告

W12: Warning: File "/etc/hosts" has changed and the buffer was changed in Vim as well
See ":help W12" for more info.
[O]K, (L)oad File:

这是因为正在编辑的文件已经在别处被修改了,vim 询问是否要重载新文件进来,按L重载即可

参考链接

vim reggisters

赞(8) 打赏
欢迎转载,注明出处:刘世明的博客 » vim强制保存命令:w !sudo tee %详解

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下作者

支付宝扫一扫打赏

微信扫一扫打赏