Tampaknya ada beberapa pendekatan yang berbeda, bergantung pada masalah Anda saat ini:
- Hanya baca oleh vi. Jika file Anda memiliki
:set readonly
kamu bisa- Gunakan
:w!
untuk memaksa menulis, atau - Masalah
:set noreadonly
dan kemudian gunakan saja:w
biasa
- Gunakan
- Sebuah izin masalah (sudo ):Anda tidak dapat menulis tetapi Anda memiliki hak sudo.
- Masalah:
:w !sudo tee %
. Ini akan menulis buffer ketee
, perintah yang menerima pipa informasi dan dapat menulis ke file. Dan saat tee dijalankan dengan kekuatan sudo, tee dapat memodifikasi file.
- Masalah:
- Sebuah izin masalah (tanpa sudo ):Anda tidak memiliki hak untuk menulis file dan Anda tidak memiliki akses admin.
- Gunakan
:w! ~/tempfile.ext
untuk menulis perubahan Anda ke file sementara dan kemudian mengambil tindakan untuk memindahkan file temp ke direktori (kirim file temp ke pemilik/admin direktori).
- Gunakan
Anda dapat membaca selengkapnya di sini:
- Dari StackOverflow
- Dari Geekyboy
- Dari Data Agaric
Pintasan
Seperti yang sering terjadi masalah #2 (izin masalah, dengan sudo ), Anda dapat ke /etc/vim/vimrc
Anda (atau ~/.vimrc
) pintasan berikut:
cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!
Kemudian Anda cukup mengetikkan :w!!
untuk menyimpan dengan sudo kekuatan. Saya tidak akan menjelaskannya di sini tetapi referensi di atas mencakup banyak pintasan.
Saya dapat memikirkan dua cara untuk melakukan ini.
Cara pertama mengasumsikan Anda memiliki file tersebut, tetapi file tersebut HANYA DIBACA.
Cukup gunakan akhiran tanda seru vi ke perintah tulis (:w!) untuk memaksa menimpa file READONLY Anda sendiri. Ini tentu saja mengasumsikan bahwa Anda memiliki izin untuk menulis dan mengeksekusi di folder saat ini.
:w!
akan menyebabkan vi menimpa file READONLY asli.
Cara kedua mengasumsikan orang lain memiliki file tersebut, dan Anda ingin menyimpan perubahan Anda ke file tersebut.
Salah satu cara untuk melakukannya adalah dengan menyimpan perubahan yang dilakukan pada file asli sebagai skrip ed dari dalam vi. Skrip ed ini dapat diterapkan ke file asli (atau file serupa lainnya) di lain waktu di luar vi dengan editor baris ed.
Sebuah cara untuk menyimpan sesi edit saat ini sebagai skrip ed adalah dengan meneruskan nama file asli dan buffer vi yang telah diedit sebagai input standar ke utilitas diff dengan saklar baris perintah --ed yaitu menampilkan perbedaan sebagai skrip ed.
Jadi, asumsikan buffer vi yang telah diedit, lalu lakukan hal berikut
:.,$!diff --ed [original_file] -
Ini menggantikan semua baris dalam buffer saat ini (.,$!) dengan skrip ed yang dihasilkan diff (diff --ed [file_asli] -) yang diperlukan untuk mengubah file asli menjadi konten buffer saat ini. Kami kemudian ingin menyimpan skrip ed ini ke tempat yang aman, dan menerapkan skrip ke versi file asli yang dapat kami tulis. Jadi, simpan skrip ke lokasi yang dapat ditulisi, misalnya folder login Anda:
:w ~/my_ed_script
Sekarang keluar dari vi, dan gunakan skrip ed ini untuk mendapatkan file yang diedit yang tidak dapat disimpan. Berikut ini cara melakukannya dari prompt baris perintah bash, '$':
$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file
Apa yang urutan perintah ini lakukan dalam kata-kata adalah untuk menggabungkan skrip yang kami buat dengan diff dan menggemakan perintah ed write, 'w', ke input standar ed. Ed kemudian menerapkan skrip ini ke salinan file asli yang dapat ditulis, dan menulis kembali perubahan buffer yang dimodifikasi tersebut ke file.
Jadi itu adalah cara untuk menyimpan pekerjaan yang dilakukan di vi ke file yang awalnya dimiliki oleh orang lain menggunakan vi, diff, dan ed.