Sembra che ci siano alcuni approcci diversi, a seconda del tuo problema attuale:
- Sola lettura di vi. Se il tuo file contiene
:set readonly
puoi- Usa
:w!
per forzare la scrittura, o - Numero
:set noreadonly
e poi usa il normale:w
- Usa
- Un permesso problema (sudo ):non puoi scrivere ma hai i diritti sudo.
- Problema:
:w !sudo tee %
. Questo scriverà il buffer intee
, un comando che riceve pipe informazioni e può scrivere su file. E poiché tee viene eseguito con sudo powers, tee può modificare il file.
- Problema:
- Un permesso problema (no sudo ):non hai i diritti per scrivere il file e non hai accesso come amministratore.
- Usa
:w! ~/tempfile.ext
per scrivere le modifiche in un file temporaneo e quindi adottare misure per spostare il file temporaneo nella directory (inviare il file temporaneo al proprietario/amministratore della directory).
- Usa
Puoi leggere di più qui:
- Da StackOverflow
- Da Geekyboy
- Da Data Agarico
Scorciatoia
Come spesso accade, il problema n. 2 (permesso problema, con sudo ), puoi al tuo /etc/vim/vimrc
(o ~/.vimrc
) la seguente scorciatoia:
cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!
Quindi puoi semplicemente digitare :w!!
per salvare con sudo poteri. Non lo spiegherò qui, ma i riferimenti sopra coprono molte scorciatoie.
Mi vengono in mente due modi per farlo.
Il primo modo presuppone che tu sia il proprietario del file, ma il file è READONLY.
Basta usare il suffisso del punto esclamativo di vi al comando di scrittura (: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à in modo che vi sovrascriva il file READONLY originale.
Il secondo modo presuppone che qualcun altro sia il proprietario del file e tu desideri salvare le modifiche a quel file.
Un modo per farlo è salvare le modifiche apportate al file originale come uno script ed dall'interno di vi. Questo script ed può essere applicato al file originale (o ad altri file simili) in un secondo momento al di fuori di vi con l'editor della linea ed.
Un modo per salvare la sessione di modifica corrente come script ed è 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 script ed.
Quindi, assumendo un buffer vi modificato, esegui quanto segue
:.,$!diff --ed [original_file] -
Questo sostituisce tutte le righe nel buffer corrente (.,$!) con lo script ed generato da diff (diff --ed [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 è stato possibile salvare in primo luogo. Ecco come farlo 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 in parole è concatenare lo script che abbiamo generato con diff e fa eco al comando ed write, 'w', all'input standard di ed. Ed quindi applica questo script alla copia scrivibile del file originale e riscrive le modifiche apportate al buffer nel file.
Quindi questo è un modo per salvare il lavoro eseguito in vi in un file che era originariamente di proprietà di qualcun altro usando vi, diff ed ed.