Si usas Vim o Neovim, es probable que alguna vez te hayas encontrado con que no puedes guardar las modificaciones que has hecho en un archivo, porque no tienes permiso de escritura o el archivo no te pertenece.
La solución más sencilla es acordarse de usar sudo
antes de editar un
archivo sobre el que no tenemos permiso (suelen ser archivos de
configuración del sistema). Pero cuando el olvido de sudo
ya ha
ocurrido y hemos realizado muchas modificaciones, el siguiente truco nos
ahorrará disgustos y tiempo.
Lo primero que debemos hacer es analizar la situación. Si el editor no
nos deja guardar el archivo es porque no tenemos permiso para
modificarlo. Podemos intentarlo, ejecutando :w!
, pero si el archivo
pertenece a otro usuario y no tenemos permiso de escritura, no
funcionará.
Si nos ha dejado leer el contenido del archivo, lo que sí
podemos hacer es guardarlo con otro nombre de archivo. En Vim podemos
hacerlo ejecutando :w otro_nombre
. Pero esta solución no es del todo
satisfactoria, ya que tendríamos que ejecutar una nueva instrucción para
reemplazar el archivo que estamos editando: !sudo mv otro_nombre
%
1.
Hay una forma de lograr nuestro objetivo de forma más sencilla: usando
el programa dd. Simplemente debemos ejecutar :w !sudo dd of=%
. Esta
instrucción funciona de la siguiente manera:
:w !
. Como explica la documentación de Vim (:h w_c
), las instrucciones que siguen al símbolo de exclamación se ejecutan tomando el contenido del búfer (es decir, el archivo) como entrada estándar.sudo
nos permite ejecutar la instrucción con permisos de superusuario.dd of=%
toma como entrada la entrada estándar y escribe su contenido en el archivo que estamos editando.
Al ejecutar la anterior instrucción, debemos introducir nuestra contraseña. Luego Vim nos avisará de que el archivo ha cambiado y de que el búfer se ha modificado también. Simplemente, pulsamos O y, despúes, Intro para continuar.
Como el truco puede resultar difícil de recordar, es buena idea añadir la siguiente línea al archivo de configuración de Vim:
cmap w!! w !sudo dd of=%<Enter>
Con ella, solo hace falta ejecutar :w!!
la próxima vez que tengamos
este problema.
-
%
equivale a poner la ruta del archivo que estamos editando, ejecuta:h %
para más información. El!
al principio de la instrucción le indica a Vim que ejecute una instrucción usando el intérprete del sistema, ejecuta:h :!
para más información. ↩
Comentarios