Bagaimana cara `: w! Sudo tee%` bekerja


27

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 :wbagian itu, ia menulis buffer saat ini ke disk, dengan asumsi sudah ada nama file yang terkait dengannya, kan?
Saya juga mengerti !yang mengeksekusi sudo teeperintah dan %mewakili konten buffer saat ini kan?
Tetapi masih tidak mengerti bagaimana ini bekerja.

Jawaban:


30

Struktur ini :w !cmdberarti "tulis buffer saat ini yang disalurkan melalui perintah". Jadi Anda bisa melakukannya, misalnya :w !catdan itu akan menyalurkan buffer cat.

Sekarang %adalah nama file yang terkait dengan buffer

Jadi :w !sudo tee %akan menyalurkan isi buffer melalui sudo tee FILENAME. Ini secara efektif menulis isi buffer ke file.


Dan apa itu tee?
— CodyBugstein


2

Tidak benar!

!commandmenjalankan perintah sebagai perintah filter , yang mengambil teks dari stdin, melakukan sesuatu dan output stdout.

Dengan menggunakan w, Anda mendorong isi file ke stdindari sudo tee %. %adalah register khusus dalam vim, yang menyimpan nama file saat ini.

Jadi Anda dapatkan sudo tee FILENAME, yang akan mendorong tee stdin- konten file - ke file saat ini.


2
:!commandadalah filter (lih. :h !), sementara :w !commandtidak, itu hanya dijalankan commanddengan file saat ini sebagai stdin(lih :h :w_c.). Intinya: :w !sed /./dtidak 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.
— Satō Katsura
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.