Bagaimana cara menyimpan file yang saya tidak punya izin menulis?

26

Kadang-kadang terjadi bahwa saya membuka file dan membuat beberapa modifikasi sebagai pengguna saya sendiri, tanpa memperhatikan atau "lupa" untuk memperhatikan [read-only]peringatan di baris status (mis. Beberapa /etcfile konfigurasi acak suka /etc/resolv.conf).

:w!jelas gagal dalam hal ini karena pengguna saya tidak memiliki izin menulis. Jadi saya harus :w /home/filename, keluar dan sudo mv ..., sangat tidak nyaman.

Apakah ada cara agar saya meningkatkan sementara waktu untuk melakukan root agar dapat menyimpan file yang sedang dibuka? (mengingat saya di sudoersatau / dan saya bisa sulangsung)?

guido
sumber

Jawaban:

24

Caranya adalah dengan menggunakan panggilan eksternal ke sudo:

:w !sudo tee %

Bagaimana ini bekerja:

  • :w !<command>dijalankan <command>dengan isi buffer sebagai stdin.
  • teeduplikat stdin ke file & stdout; %memperluas ke nama file saat ini ..
  • Anda awali ini dengan sudoizin root.

Anda tidak benar - benar menyimpan file dengan Vim, melainkan, Anda memanggil program eksternal untuk menimpa konten file yang sedang Anda edit. Inilah mengapa Anda akan mendapat peringatan dari Vim:

W12: Warning: File "xxx" has changed and the buffer was changed in Vim as well
See ":help W12" for more info.
[O]K, (L)oad File: 

Anda bisa mengubahnya menjadi fungsi:

fun! SuperWrite()
        write !sudo tee %
        " Or with :silent (but that doesn't seem to work for everyone)
        "silent write !sudo tee %
        edit!
endfun

Dan keybind:

nnoremap <Leader>w! :call SuperWrite()<CR>

Dengan su, hanya pengguna root yang dapat digunakan -cuntuk segera menjalankan perintah. Saya tidak berpikir Anda dapat menggunakannya suuntuk melakukan ini, tapi mungkin ada trik yang saya tidak sadari ...

Martin Tournoij
sumber
SuperWriteberfungsi, tetapi itu menggemakan file kembali pada Anda. Dengan menjalankannya, :silentAnda memasukkan kata sandi tanpa terlihat.
TankorSmash
@TankorSmash Terima kasih; jawaban yang diperbarui. Namun, tidak yakin apa yang Anda maksud dengan "masukkan kata sandi Anda"? Menambahkan silentsepertinya berfungsi dengan baik?
Martin Tournoij
Saya tidak menjalankan vim dengan sudo, jadi itu mungkin bermain di sini, tetapi ketika saya pergi ke sudo tee file, itu meminta saya untuk kata sandi sudo. Jika diam, saya tidak melihat prompt, tetapi masih perlu memasukkan kata sandi.
TankorSmash
1
Apa yang Anda lihat adalah fungsi standar dari gema ke stdout serta file yang diberikan. Solusinya adalah dengan mengarahkan ulang stdout ke / dev / null, ala: w ! tee % > /dev/null Ini masih akan mengulangi hasil dari perintah (satu baris), tetapi tidak seluruh isi buffer.
Jon Carter
Daripada menggunakan teekemudian membuang outputnya, tidak akan catjuga berfungsi jika Anda tidak ingin file dicetak?
Lie Ryan
12

Saya menggunakan pemetaan berikut di .vimrc saya, yang menurut saya berguna:

cnoremap w!! w !sudo tee %

Mudah diingat, karena w"menulis," w!adalah "memaksa menulis," dan "menulis dengan kekuatan w!!super duper". : P

Gagang pintu
sumber
1
Saya sudah lama memetakannya W, tetapi w!!jauh lebih masuk akal, akan memperbarui .vimrc saya. Terima kasih
jalanb