27 如果您打开了没有权限在vim中写入的文件,然后决定需要对其进行更改,那么您就可以编写更改而无需退出vim,:w !sudo tee % 这是因为我不知道该如何工作。可以请你解剖一下吗? 我了解这一:w部分,它假定将已经存在的文件名与当前缓冲区关联,它将当前缓冲区写入磁盘,对吗? 我也了解!哪个执行sudo tee命令并%代表当前缓冲区内容,对吗? 但是仍然不了解它是如何工作的。 vim sudo tee — 阿里 source
30 该结构的:w !cmd意思是“编写通过命令通过管道传送的当前缓冲区”。例如:w !cat,您可以这样做,它将缓冲区通过管道传递cat。 现在%是与缓冲区关联的文件名 因此,:w !sudo tee %将缓冲区的内容通过管道传递sudo tee FILENAME。这有效地将缓冲区的内容写出到文件中。 — 史蒂芬·哈里斯 source
7 % 表示当前缓冲区的文件名,而不是其内容。 因此,:w !sudo tee %意味着将当前缓冲区传递给sudo tee [currentfilename]。 tee 以root身份运行,因此具有写权限将其stdin保存到文件中。 另请参阅https://stackoverflow.com/questions/2600783/how-does-the-vim-write-with-sudo-trick-work — cas source
2 不太正确! !command将命令作为过滤器命令运行,该命令从中获取文本stdin,执行某些操作并将其输出到stdout。 通过使用w,你推送文件内容stdin的sudo tee %。%是vim中的特殊寄存器,用于保存当前文件的名称。 这样您就sudo tee FILENAME可以将tee stdin文件内容推送到当前文件。 — cuonglm source 2 :!command是一个过滤器(参见:h !),但:w !command不是,它仅以command当前文件作为stdin(参见:h :w_c)执行。智慧::w !sed /./d不会更改当前缓冲区的内容。但是由于其他原因,该食谱的确不完全正确,%需要避免:exec 'w !sudo tee ' . shellescape(expand('%', 1))。原始命令不适用于带空格的文件名。 — 桂桂聪(SatōKatsura)
:!command
是一个过滤器(参见:h !
),但:w !command
不是,它仅以command
当前文件作为stdin
(参见:h :w_c
)执行。智慧::w !sed /./d
不会更改当前缓冲区的内容。但是由于其他原因,该食谱的确不完全正确,%
需要避免:exec 'w !sudo tee ' . shellescape(expand('%', 1))
。原始命令不适用于带空格的文件名。