回答:
構造:w !cmd
は、「コマンドを介してパイプされた現在のバッファを書き込む」ことを意味します。そのため、たとえば、次のことができます。これ:w !cat
により、バッファがを通じてパイプされcat
ます。
これ%
は、バッファに関連付けられたファイル名です
その:w !sudo tee %
ため、バッファの内容はを通してパイプされsudo tee FILENAME
ます。これにより、バッファの内容がファイルに効果的に書き込まれます。
%
内容ではなく、現在のバッファのファイル名を表します。
したがって:w !sudo tee %
、現在のバッファをにパイプしsudo tee [currentfilename]
ます。
tee
はrootとして実行されているため、そのstdinをファイルに保存する書き込みアクセス権があります。
https://stackoverflow.com/questions/2600783/how-does-the-vim-write-with-sudo-trick-workも参照してください
:!command
はフィルター(cf.:h !
)ですが、そうで:w !command
はありませんcommand
が、現在のファイルstdin
(cf.:h :w_c
)で実行されます。wit to::w !sed /./d
現在のバッファの内容を変更しません。しかし、このレシピは別の理由で実際にはまったく適切ではないため、%
エスケープする必要があります:exec 'w !sudo tee ' . shellescape(expand('%', 1))
。元のコマンドは、たとえば、スペースを含むファイル名では機能しません。