Solución:
Parece haber algunos enfoques diferentes, dependiendo de su problema actual:
-
Solo lectura por vi. Si su archivo tiene
:set readonly
usted puede- Usar
:w!
forzar la escritura, o - Asunto
:set noreadonly
y luego solo usa normal:w
- Usar
- A permiso problema (sudo): no puede escribir pero tiene derechos de sudo.
- Asunto:
:w !sudo tee %
. Esto escribirá el búfer entee
, un comando que recibe tubo información y puede escribir en archivos. Y como tee se ejecuta con poderes sudo, tee puede modificar el archivo.
- Asunto:
- A permiso problema (no sudo): no tiene derechos para escribir el archivo y no tiene acceso de administrador.
- Usar
:w! ~/tempfile.ext
para escribir sus cambios en un archivo temporal y luego tomar medidas para mover el archivo temporal al directorio (envíe el archivo temporal al propietario / administrador del directorio).
- Usar
Puedes leer más sobre esto aquí:
- De StackOverflow
- De Geekyboy
- De Data Agaric
Atajo
Como suele ser el caso del problema n. ° 2 (permiso problema con sudo), puedes a tu /etc/vim/vimrc
(o ~/.vimrc
) el siguiente atajo:
cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!
Entonces puedes simplemente escribir :w!!
para ahorrar con sudo potestades. No lo explicaré aquí, pero las referencias anteriores cubren muchos atajos.
Puedo pensar en dos formas de hacer esto.
La primera forma asume que usted es el propietario del archivo, pero el archivo es READONLY.
Simplemente use el sufijo de signo de exclamación de vi para el comando de escritura (: w!) Para forzar la sobrescritura de su propio archivo READONLY. Por supuesto, esto supone que tiene permiso para escribir y ejecutar en la carpeta actual.
:w!
hará que vi sobrescriba el archivo READONLY original.
La segunda forma asume que otra persona es propietaria del archivo y que le gustaría guardar sus cambios en ese archivo.
Una forma de lograrlo es guardar los cambios realizados en el archivo original como un script ed desde vi. Este script ed se puede aplicar al archivo original (u otros archivos similares) en un momento posterior fuera de vi con el editor de línea ed.
Una forma de guardar la sesión de edición actual como un script ed es pasar el nombre del archivo original y el búfer vi editado como entrada estándar a la utilidad diff con el interruptor de línea de comando –ed, es decir, mostrar las diferencias como un script ed.
Entonces, asumiendo un búfer vi editado, realice lo siguiente
:.,$!diff --ed [original_file] -
Esto reemplaza todas las líneas en el búfer actual (., $!) Con el script ed generado por diff (diff –ed [original_file] -) necesario para convertir el archivo original en el contenido del búfer actual. Luego queremos guardar este script ed en un lugar seguro y aplicar el script a una versión del archivo original en el que podamos escribir. Por lo tanto, guarde el script en una ubicación en la que se pueda escribir, por ejemplo, su carpeta de inicio de sesión:
:w ~/my_ed_script
Ahora salga de vi y use este script ed para obtener el archivo editado que no se pudo guardar en primer lugar. Aquí se explica cómo lograr eso desde el indicador de línea de comando de bash, ‘$’:
$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file
Lo que hace esta secuencia de comandos en palabras es catenar el script que generamos con diff y repite el comando ed write, ‘w’, en la entrada estándar de ed. Luego, Ed aplica este script a la copia grabable del archivo original y escribe esos cambios de búfer modificados en el archivo.
Así que esa es una forma de guardar el trabajo realizado en vi en un archivo que originalmente había sido propiedad de otra persona que usaba vi, diff y ed.