Guardar archivo como superusuario desde Vim

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.

Demostración

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.


  1. % 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