Vim: Guardar archivo de solo lectura

jun. 6, 2012·
Julio Batista Silva
Julio Batista Silva
· 2 min de lectura

Hoy, después de un buen rato editando el archivo de configuración de Apache (/etc/httpd/httpd.conf), me di cuenta de que estaba logueado como usuario normal y no podía guardar el archivo (E212: Can't open file for writing).

Una solución común es guardar una copia en algún directorio y luego sustituir el archivo original por la copia usando sudo mv. Pero sabía que existía una forma más simple, porque ya me pasó varias veces en el pasado.

Había olvidado el comando, pero conseguí encontrarlo y lo dejo registrado aquí para futuras consultas.

Basta con llamar a sudo tee directamente desde Vim: :w !sudo tee %

Vim avisará (W12) que el archivo fue modificado y debe recargarse. Pulsa L para recargar.

¿Por qué funciona?

De la ayuda de Vim (:help) y man tee, tenemos:

  • :w[rite] {file} ⇒ Escribe todo el buffer en {file}.
  • !{cmd} ⇒ Ejecuta {cmd} con el shell.
  • tee [FILE] ⇒ Lee de la entrada estándar y escribe en FILE (o stdout).
  • % ⇒ Referencia al archivo actual.

Es decir, enviamos el buffer como si fuera un pipe a la entrada de sudo tee %, que escribe ese buffer en el archivo actual, pero como superusuario.

Algunas alternativas que encontré en commandlinefu:

  • :%!sudo tee %
  • :w !sudo tee > /dev/null %
  • command W :execute ':silent w !sudo tee % > /dev/null' | :edit!
  • :w !pfexec tee %

Neovim

(Sección añadida en marzo de 2024)

El consejo anterior no funciona en Neovim (ver https://github.com/neovim/neovim/issues/1716).

Afortunadamente, existen plugins que resuelven este problema. Yo uso Suda: https://github.com/lambdalisue/suda.vim.

Añade los comandos :SudaWrite y :SudaRead para escribir y leer archivos que necesitan permisos elevados.


Enlaces

Julio Batista Silva
Autores
Senior Cloud Developer
comments powered by Disqus