回答:
構造: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))。元のコマンドは、たとえば、スペースを含むファイル名では機能しません。