`:w!sudo tee%`の仕組み


27

vimに書き込む権限のないファイルを開いてから、変更する必要があると判断した場合、vimを終了せずに変更を書き込むことができます:w !sudo tee %
。これを解剖してください。
私はその:w部分を理解しています、それは現在のバッファをディスクに書き込みます、すでにそれに関連付けられたファイル名があると仮定しますよね?
また!sudo teeコマンドを実行し%、現在のバッファの内容を表すものを理解していますか?
しかし、これがどのように機能するかまだ理解していない。

回答:


30

構造:w !cmdは、「コマンドを介してパイプされた現在のバッファを書き込む」ことを意味します。そのため、たとえば、次のことができます。これ:w !catにより、バッファがを通じてパイプされcatます。

これ%は、バッファに関連付けられたファイル名です

その:w !sudo tee %ため、バッファの内容はを通してパイプされsudo tee FILENAMEます。これにより、バッファの内容がファイルに効果的に書き込まれます。



2

まったく正しくありません!

!commandコマンドをフィルターコマンドとして実行します。フィルターコマンドは、からテキストを取得しstdin、何かを実行し、に出力しstdoutます。

を使用してw、ファイルコンテンツをstdinにプッシュしましたsudo tee %%vimの特殊レジスターで、現在のファイルの名前を保持します。

だからsudo tee FILENAMEtee stdinファイルの内容を現在のファイルにプッシュします。


2
:!commandはフィルター(cf. :h !)ですが、そうで:w !commandはありませんcommandが、現在のファイルstdin(cf. :h :w_c)で実行されます。wit to::w !sed /./d現在のバッファの内容を変更しません。しかし、このレシピは別の理由で実際にはまったく適切ではないため、%エスケープする必要があります:exec 'w !sudo tee ' . shellescape(expand('%', 1))。元のコマンドは、たとえば、スペースを含むファイル名では機能しません。
桂佐藤
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.