Vim: guardar un archivo de solo lectura

Hoy, después de un buen rato editando la configuración de Apache (/etc/httpd/httpd.conf), me di
cuenta de que estaba con un usuario normal y no podía guardar el archivo
(E212: Can't open file for writing).
Una solución habitual es guardar una copia en cualquier directorio y luego sustituir el original con
sudo mv. Pero sabía que hay una forma más sencilla, porque ya me había pasado varias veces.
Había olvidado el comando, pero lo encontré y lo dejo apuntado aquí para el futuro.
Basta con llamar a sudo tee desde el propio vim: :w !sudo tee %
Vim avisará (W12) de que el archivo cambió y hay que recargarlo. Pulsa L para recargar.
¿Por qué funciona?
Del :help de vim y de man tee:
:w[rite] {file}⇒ escribe todo el búfer en {file}.!{cmd}⇒ ejecuta {cmd} en el shell.tee [FILE]⇒ lee de la entrada estándar y escribe en FILE (o en stdout).%⇒ referencia al archivo actual
Es decir, mandamos el búfer como si fuera una tubería a la entrada de sudo tee %, que lo escribe
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 truco anterior no funciona en Neovim (ver https://github.com/neovim/neovim/issues/1716).
Por suerte hay plugins que lo resuelven. Yo uso Suda: https://github.com/lambdalisue/suda.vim.
Añade los comandos :SudaWrite y :SudaRead para escribir y leer archivos que requieren permisos
elevados.
Links

Soy un ingeniero informático brasileño radicado en Alemania, apasionado por la tecnología, la ciencia, la fotografía y los idiomas.
Llevo programando cerca de dos décadas, explorando desde apps móviles y desarrollo web hasta aprendizaje automático. Hoy me enfoco en SRE en la nube e ingeniería de datos.
Soy voluntario en las comunidades de open source y Python, ayudando a organizar PyCon DE y PyData Berlin, dando mentorías y contribuyendo con código y traducciones.
En mi blog comparto consejos de Linux, guías de configuración y notas personales que escribí como referencia futura. Espero que también sean útiles para otras personas. El contenido está disponible en varios idiomas.
Visita mi galería para ver algunas de mis fotografías.
Fuera del teclado, me encontrarás en conciertos, tocando el clarinete, en bicicleta, buceando o explorando nuevos lugares, culturas y cocinas.
¡Siempre feliz de conectar! 🙂