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.
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
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.
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.
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.
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
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 bufferB
(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 bufferB
en el área correspondiente del bufferC
. !
- 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
, oB
, oC
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 comandoM-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 comandoeregistry
o conR
si tenemos acceso al controlador deediff
. 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.