Abr 24 2009

Ediff (Diffs en emacs)

Tag: basicoverdrive @ 3:09 am

En el artículo anterior explicabamos como trabajar con VC para el control de versiones, de aquí la importancia de este artículo, que enseña a utilizar ediff para ver las diferencias entre varios ficheros y esto puede emplearse de forma conjunta y muy útil con VC.

Se puede emplear M-x ediff-revision para iniciar ediff. En este modo podemos emplear distintas teclas asociadas a funciones relacionadas con ediff:

? : ‘ediff-help‘; ayuda sobre ediff
n ó SPC : ‘ediff-next-difference‘; muestra la siguiente diferencia.
p ó DEL : ‘ediff-previous-difference‘; muestra la diferencia anterior.
j : ‘ediff-jump-to-difference‘; se desplaza o salta a una diferencia específica.
C-v ó v ó >: ‘ediff-scroll-vertically‘; pasa a la siguiente página de diferencias.
M-v ó V ó <: ‘ediff-scroll-horizontally‘; pasa a la página anterior de diferencias.
| (pipe): ‘ediff-toggle-split‘; intercambia las vistas de los buffers.
m : ‘ediff-toggle-wide-display‘; hace toggle entre el tamaño normal y el ancho máximo.
a : ‘ediff-copy-A-to-B‘; copia la diferencia actual en el buffer del fichero A sobre el buffer del fichero B.
b : ‘ediff-copy-B-to-A‘; copia la diferencia actual en el buffer del fichero B sobre el buffer del fichero A.
r a ó r b : ‘ediff-restore-diff‘; restaura la diferencia actual del fichero del buffer A (ó B respectivamente) a la anterior.
A ó B : ‘ediff-toggle-read-only‘; Cambia el buffer a sólo lectura/escritura para A (ó B respectivamente).
g a ó g b : ‘ediff-jump-to-difference-at-point‘; re-centra la comparación de buffers en la diferencia más cercana a la localización actual.
C-l : ‘ediff-recenter‘; restaura la comparación mostrada para que sean resaltadas las regiones de todos los buffers y sean visibles.
! : ‘ediff-update-diffs‘; actualiza y vuelve a mostrar las regiones resaltadas.
w a ó w b : ‘ediff-save-buffer‘; guarda un buffer específico en el disco.
E : ‘ediff-documentation‘; abre el manual para ediff.
z : ‘ediff-suspend‘; cierra la ventana de control de ediff, pero deja la sesión activa por lo que puede ser recuperada luego.
q : ‘ediff-quit‘; cierra ediff.

Además usando C-h i se accede a info de cada acción de ediff. Por ejemplo C-h i m e d, haria info (C-h i) para el menú (m) de e (ediff) d (de la función asociada a e dentro de ediff).


Abr 24 2009

VC (Version Control) en emacs

Tag: basicoverdrive @ 12:56 am

Emacs provee de un front-end que agiliza el uso de control de versiones, dicha feature se llama VC (Version Control) y permite usar de forma generalizada distintos controles de versiones mediante una misma interfaz. Los controles de versiones soportados son SCCS, RCS, CVS, SVN, GIT y demás, aunque algunos de ellos no estan adaptados perfectamente o requieren de algún otro front-end más específico para ellos mismos, como es el caso de emergente GIT.

Modelo tradicional vs concurrente

Existen dos modelos basicos a hora de trabajar con controles de versiones, uno es el tradiciona y otro el concurrente que muestro a continuacion para notar las diferencias:

Modelo tradicional:

modelo tradicional

Modelo concurrente:

concurrente

(Imágenes extraidas del libro ‘Learning GNU Emacs’, 3rd Edition by Debra Cameron, James Elliot, Marc Loy. O’Reilly)

Por lo que puede existir algún problema durante los procesos de check in debemos intentar resolverlos mediante M-x vc-resolve-conflicts. A partir de aquí podemos comenzar a explicar las siguientes tareas típicas y los keybindings asociados a un proceso general de desarrollo.

C-c C-c; commit del buffer comentado.
C-x v u: ‘vc-revert-buffer‘; revisa los cambios realizados desde el último check in.
C-x v c: ‘vc-cancel-version‘; cancela una revisión.

Indicadores VC

En el modeline se pueden mostrar los siguientes indicadores:

Si no muestra nada indica que no se está bajo VC.
CVS-version cambiado respecto al repositorio.
CVS:version cambios guardados pero no committeados.

Además debemos comprobar la variable ‘vc-handeled-backends’ que revisa cuál es el control de versiones disponible en el sistema que puede ser:

comb: el control de versiones empleado en el sistema es SCCS.
rcs: el control de versiones empleado en el sistema es RCS.
cvs: el control de versiones empleado en el sistema es CVS.
snv: el control de versiones empleado en el sistema es SNV.

Trabajando con grupos y directorios

C-x v d: ‘vc-directory‘; configura dired para registrar ficheros bajo el directorio actual.

Reporte de revisiones

C-x v =; ‘vc-diff‘; configura dired para mostrar los diffs y presionando ‘g‘ refresca el estado de VC en el directorio.
C-u C-x v =; muestra el fichero y dos revisiones para reportar diffs entre dichas versiones del fichero.
C-x v ~: ‘vc-version-other-window‘; realiza la revisión de cualquier fichero guardado.

Si estamos en foo.c y pulsamos C-x v ~ 1.3 abrirá el fichero foo.c~1.3~ (es decir la version 1.3 de dicho fichero).

Historial de cambios

C-x v l: ‘vc-print-log‘; muestra cambios en el historial y changelog.
C-x v a: ‘vc-update-change-log‘; actualiza el fichero changelog al estilo GNU.

Registrando un fichero

C-x v i: ‘vc-register‘; registrar un fichero en el control de versiones.

Insertando cabeceras del control de versiones

C-x v h: ‘vc-insert-headers‘; inserta cabeceras de control.

Además existe la variable ‘comment-start‘ y ‘comment-end‘ que puede tomar uno de estos tres valores: nroff, troff. groff.

Creando y recuperando snapshots

C-x v r: ‘vc-retrieve-snapshot‘; hace check out del snapshot del proyecto de desarrollo o lo que es lo mismo, asocia un nombre un snapshot nuevo.
C-x v s: ‘vc-create-snapshot‘; crea un nuevo snapshot del proyecto de desarrollo.

Renombrando ficheros

vc-rename-file‘; dicha función renombra un fichero bajo el control de versiones. Aunque en algunos controles de versiones da problemas, por lo que si ocurre debemos realizar de nuevo la acción limpiando la cache mediante ‘vc-clear-context‘.

Configurando VC

Las siguientes variables pueden modificarse para alterar el funcionamiento y configuración de VC:

vc-display-backends‘; maneja el control de versiones usado por VC.
vc-display-status‘; muestra el número de revisión y su estado.
vc-backend-header‘; contiene un listado de cabeceras dado por la variable ‘vc-cvs-header‘, etc.
vc-keep-workfiles‘; evita tener que hacer check out cada vez.
vc-mistrust-permissions‘; si se pone a ‘t‘ le indica a VC que no confie en los permisos del fichero local, sino en los del control de versiones.
vc-suppress-confirm‘; si se pone a ‘t’ elimina la confirmación para ‘vc-revert-buffer‘.
vc-initial-comment‘; comentario inicial cuando se muestra un fichero (opcional) por los controles de versiones.
vc-switches‘; puede tomar 2 valores:

-c para cuando haga diff tenga un formato context-diff.
-u para cuando haga diff tenga un formato unified-diff.

Extendiendo VC

Existen extensiones por ejemplo para ClearCase de IBM, llamada vc-clearcase.