Posso pensare a due modi per farlo.
Il primo modo presuppone che tu sia il proprietario del file, ma il file è PRONTO.
Basta usare il suffisso del punto esclamativo di vi sul comando write (: w!) Per forzare la sovrascrittura del proprio file READONLY. Questo ovviamente presuppone che tu abbia il permesso di scrivere ed eseguire nella cartella corrente.
:w!
farà sì che vi sovrascriva il file READONLY originale.
Il secondo modo presuppone che qualcun altro possieda il file e si desidera salvare le modifiche in quel file.
Un modo per ottenere ciò è salvare le modifiche apportate al file originale come script ed all'interno di vi. Questo script ed può essere applicato al file originale (o altri file simili) in un momento successivo al di fuori di vi con l'editor della linea ed.
Un modo per salvare la sessione di modifica corrente come uno script ed è quello di passare il nome del file originale e il buffer vi modificato come input standard all'utilità diff con l'opzione della riga di comando --ed ovvero visualizzare le differenze come uno script ed.
Quindi, supponendo un buffer vi modificato, quindi eseguire quanto segue
:.,$!diff --ed [original_file] -
Questo sostituisce tutte le righe nel buffer corrente (., $!) Con lo script ed generato diff (diff - file [file_originale] -) necessario per convertire il file originale nel contenuto del buffer corrente. Vogliamo quindi salvare questo script ed in un posto sicuro e applicare lo script a una versione del file originale su cui possiamo scrivere. Quindi, salva lo script in una posizione scrivibile, ad esempio la tua cartella di accesso:
:w ~/my_ed_script
Ora esci da vi e usa questo script ed per ottenere il file modificato che non poteva essere salvato in primo luogo. Ecco come eseguire ciò dal prompt della riga di comando di bash, '$':
$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file
Ciò che questa sequenza di comandi fa a parole è catenare lo script che abbiamo generato con diff ed echeggia il comando ed write, 'w', sull'input standard di ed. Ed applica quindi questo script alla copia scrivibile del file originale e riscrive le modifiche al buffer modificate nel file.
Quindi questo è un modo per salvare il lavoro svolto in vi in un file che era stato originariamente posseduto da qualcun altro usando vi, diff ed ed.