`:w!sudo tee%`如何工作


27

如果您打开了没有权限在vim中写入的文件,然后决定需要对其进行更改,那么您就可以编写更改而无需退出vim,:w !sudo tee %
这是因为我不知道该如何工作。可以请你解剖一下吗?
我了解这一:w部分,它假定将已经存在的文件名与当前缓冲区关联,它将当前缓冲区写入磁盘,对吗?
我也了解!哪个执行sudo tee命令并%代表当前缓冲区内容,对吗?
但是仍然不了解它是如何工作的。

Answers:


30

该结构的:w !cmd意思是“编写通过命令通过管道传送的当前缓冲区”。例如:w !cat,您可以这样做,它将缓冲区通过管道传递cat

现在%是与缓冲区关联的文件名

因此,:w !sudo tee %将缓冲区的内容通过管道传递sudo tee FILENAME。这有效地将缓冲区的内容写出到文件中。



2

不太正确!

!command将命令作为过滤器命令运行,该命令从中获取文本stdin,执行某些操作并将其输出到stdout

通过使用w,你推送文件内容stdinsudo tee %%是vim中的特殊寄存器,用于保存当前文件的名称。

这样您就sudo tee FILENAME可以将tee stdin文件内容推送到当前文件。


2
:!command是一个过滤器(参见:h !),但:w !command不是,它仅以command当前文件作为stdin(参见:h :w_c)执行。智慧::w !sed /./d不会更改当前缓冲区的内容。但是由于其他原因,该食谱的确不完全正确,%需要避免:exec 'w !sudo tee ' . shellescape(expand('%', 1))。原始命令不适用于带空格的文件名。
桂桂聪(SatōKatsura)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.