Jika Anda membuka file yang Anda tidak memiliki izin untuk menulis di vim, maka memutuskan Anda perlu mengubahnya, Anda dapat menulis perubahan Anda tanpa keluar vim dengan melakukan :w !sudo tee %
Saya tidak mengerti bagaimana ini bisa bekerja. Bisakah Anda membedah ini?
Saya mengerti :w
bagian itu, ia menulis buffer saat ini ke disk, dengan asumsi sudah ada nama file yang terkait dengannya, kan?
Saya juga mengerti !
yang mengeksekusi sudo tee
perintah dan %
mewakili konten buffer saat ini kan?
Tetapi masih tidak mengerti bagaimana ini bekerja.
27
tee
?%
mewakili nama file buffer saat ini, bukan isinya.jadi
:w !sudo tee %
artinya pipa buffer saat ini kesudo tee [currentfilename]
.tee
sedang dijalankan sebagai root, sehingga memiliki akses tulis untuk menyimpan stdin ke file.Lihat juga /programming/2600783/how-does-the-vim-write-with-sudo-trick-work
sumber
Tidak benar!
!command
menjalankan perintah sebagai perintah filter , yang mengambil teks daristdin
, melakukan sesuatu dan outputstdout
.Dengan menggunakan
w
, Anda mendorong isi file kestdin
darisudo tee %
.%
adalah register khusus dalam vim, yang menyimpan nama file saat ini.Jadi Anda dapatkan
sudo tee FILENAME
, yang akan mendorongtee
stdin
- konten file - ke file saat ini.sumber
:!command
adalah filter (lih.:h !
), sementara:w !command
tidak, itu hanya dijalankancommand
dengan file saat ini sebagaistdin
(lih:h :w_c
.). Intinya::w !sed /./d
tidak mengubah konten buffer saat ini. Tapi resep ini memang tidak cukup tepat untuk alasan lain,%
perlu melarikan diri::exec 'w !sudo tee ' . shellescape(expand('%', 1))
. Perintah asli tidak bekerja dengan, katakanlah, nama file dengan spasi.