Notxor tiene un blog

Defenestrando la vida


Utilizando ediff

Otra de las herramientas que viene de regalo con una instalación básica de Emacs es ediff. Supongo que a la mayoría de los que puedan leer este artículo les suena el comando diff y conocen varias herramientas que lo manejan de forma más o menos gráfica.

Captura-comando-diff.png

En la línea de comandos el comando diff es muy capaz de mostrar las diferencias que encuentra entre dos ficheros de texto, tiene cientos de opciones y puede mostrar esa información de muchas maneras. Sin embargo, como se puede apreciar en la imagen, necesita bastante entrenamiento mental para comprender de un vistazo qué ha sido cambiado y dónde. Por eso han ido apareciendo muchas herramientas más visuales que hacen de frontend del comando. Hasta hace poco yo utilizaba una que viene de regalo en KDE, Kompare.

Sin embargo, estos días aprendiendo erlang y utilizando profusamente nuestro editor favorito para programar me resultaba incómodo dejar Emacs, lanzar Kompare, cargar los ficheros, etc. Recordé que Emacs trae una herramienta para hacer lo mismo y me propuse simplificar mi vida. La opción creo que ha sido la correcta y ahora se ha convertido en mi herramienta diff por defecto.

No sólo se pueden comparar ficheros, también, también podemos comparar directorios si en lugar de utilizar el comando ediff utilizamos el comando edir. Y ambas herramientas tienen una versión para comparar 3 distintos, con ediff3 o con edir3.

Lanzar ediff

Captura-iniciando-ediff.png

No es una herramienta que se utilice de forma profusa y no creo que merezca la pena asignarle una combinación de teclas para el lanzamiento, por lo que yo sigo utilizando el habitual M-x ediff (o sus variantes).

Como he dicho antes, es posible que queramos comparar el contenido de tres ficheros a la vez. No se me ha dado el caso aún, pero todo es posible. Si llamamos al comando M-x ediff3 nos pedirá el nombre de tres ficheros y se comportará como el ediff normal, pero, como se puede apreciar en la imagen, con más diversión.

Captura-ediff-tres-ficheros.png

Una vez lanzado nos va a preguntar por los dos, o tres, ficheros que queremos comparar uno tras otro. La navegación hacia ellos es la habitual en Emacs para visitar un fichero y no tiene más misterio, si ya estamos acostumbrados a nuestro editor favorito. Sin embargo, quiero llamar la atención sobre un comportamiento de ediff que al principio me resultó chocante. Cuando se lanza ediff y carga los ficheros nos aparece otro frame como se puede apreciar en la imagen de captura. A ese marco lo llamo yo ─no he visto si tiene otro nombre─, el controlador de ediff. Todos los comandos dirigidos a ediff deben realizarse con el cursor situado en ese marco, porque los buffers que abre la herramienta, son editables ─a no ser que los marquemos como sólo lectura─. Al principio puede resultar incómodo, pero la utilidad que nos proporciona la edición merece la pena. Además cambiar de marco es sencillo: a los olvidadizos como yo les recuerdo que la combinación de teclas es C-x 5 o.

Al principio de acostumbrarnos a la herramienta es posible que necesitemos una guía de los comandos para manejarnos por ediff. Basta con pulsar ? para que el controlador muestre una generosa lista de comandos que podemos utilizar.

Captura-ediff-ayuda.png

Por defecto, cada fichero aparece en una ventana. Si nos aparecen una encima de la otra y preferimos que aparezcan de manera vertical pulsaremos la tecla | y tendremos una visión lateral de los cambios.

Captura-ediff-vertical.png

Debemos fijarnos, también, que cada buffer está marcado con una letra mayúscula A y B (y C si empleamos ediff3) y muchos comandos estarán referidos a esas marcas o nombre.

Navegar por las diferencias

Captura-ediff-navegar-diferencias.png

Como en muchos modos de Emacs podemos navegar entre las diferencias encontradas con los comandos n para siguiente (next) y p para anterior (previous). Pero además podemos hacer que las dos ventanas se muevan sincronizadas utilizando los comandos v para ir hacia abajo y V (nótese la mayúscula) para ir hacia arriba. Para movernos lateralmente podemos utilizar los comandos < para ir a la izquierda y > para ir hacia la derecha. Así no se necesita situar el cursor en ninguna de las ventanas de edición, a no ser que efectivamente queramos editar algo.

También podemos copiar el código de un buffer a otro. Por ejemplo, cuando estamos mezclando cambios en el código de varios ficheros, es posible que nos interese mover esas diferencias para generar una versión definitiva. Como hay muchos comandos que aprender y siempre es molesto cuando consultas un artículo ir saltando de un lado a otro para ver qué comando necesito, los agrupo en el siguiente punto para tener una referencia más rápida.

Comandos habituales

|
Cambia entre ventanas verticales y horizontales.
n, <SPC>
Va a la siguiente diferencia entre los ficheros.
p, <DEL>
Va a la diferencia anterior.
A, B, C
Establece o quita el marcador de solo lectura en el buffer indicado para evitar que se modifique accidentalmente. Obsérvese que este comando utiliza las mayúsculas.
a, b
Copia el contenido de la diferencia actual de buffer A al buffer B (o viceversa). Sólo funciona en sesiones con dos ficheros.
ab, ac, ba, bc, ca, cb
Copia el contenido del primer buffer de la combinación en el segundo. Es decir, el comando bc copiará el contenido del área diferente del buffer B en el área correspondiente del buffer C.
!
Recalcula las diferencias de nuevo para actualizar el contenido en el caso de que se hayan modificado los buffers.
ra, rb, rc
Restaura el valor antiguo de la región diferente del buffer A, o B, o C según el comando.
R
Muestra una lista de sesiones ediff. Si no tenemos acceso al controlador de la herramienta, podemos hacer lo mismo con el comando M-x eregistry.
z
Suspende la sesión de ediff para seguir utilizando nuestro editor para otras acciones. Podemos volver a acceder a la sesión que hemos abandonado con el comando eregistry o con R si tenemos acceso al controlador de ediff.
q
Termina la sesión actual.

Conclusiones

ediff es uno de esos redescubrimientos que realizamos de vez en cuando los usuario de emacs. Es una de esas herramientas que vienen incorporadas al editor, pero que no te das cuenta de la potencia que tienen hasta que no empiezas a utilizarlas.

Cuando programas, es muy habitual encontrarte con varias versiones del mismo fichero de código y también que necesites mover código de una versión a otra. La herramienta que nos proporciona Emacs es una de esas que de tantas opciones que tiene se hace muy difícil meterlas todas en solo artículo. Por ello es recomendable recurrir a la documentación que viene incorporada y tener una referencia más detallada de todas las opciones.


Comentarios

Debido a algunos ataques mailintencionados a través de la herramienta de comentarios, he decidido no proporcionar dicha opción en el Blog. Si alguien quiere comentar algo, me puede encontrar en Mastodon y en Diaspora con el nick de Notxor.

También se ha abierto un grupo en Telegram, para usuarios de esa red.

Disculpen las molestias.