Oct 19 2014

MAGIT: Git from Emacs

Tag: advancedoverdrive @ 3:22 pm

Hace un tiempo un amigo me pregunto como emplear diff desde emacs. Lo cierto es que en un principio pense en responderle con la utilidad M-x ediff que emacs maneja bastante bien. Sin embargo, y debido a que practicamente en todos nuestros proyectos usamos git, pense que la mejor respuesta no seria esa, sino emplear el sistema de diffs que magit provee. Asi que la solucion no era tan solo el saber como ver los diffs entre el HEAD y un fichero que se estuviese modificando, sino que pasaba por todo un conjunto de features que magit proveia y que hacia mucho mas facil no solo ver diffs, sino emplear muchas de las funcionalidades que git tenia, accesibles de manera ideal desde emacs.

Para instalar Magit, lo podemos hacer de distintas formas, ya sea mediante ELPA, Mermelade o empleando directamente el codigo del repositorio. En este caso explicare la forma recomendada por Magit, que es mediante ELPA (Emacs Lisp Package Archive), que desde Emacs 24 viene incluido por defecto en un intento de realizar instalaciones sencillas asi como actualizaciones para paquetes de Emacs Lisp.

Tan solo debemos anadir el nuevo repositorio anadiendo estas lineas a nuestro .emacs:

; Magit installation using ELPA
(require ‘package)
(add-to-list ‘package-archives
             ‘(«melpa» . «http://melpa.milkbox.net/packages/») t)

Una vez hecho esto, tan solo debemos abrir nuestro emacs, leer de nuevo el fichero de configuracion de emacs mediante M-x load-file de nuestro .emacs o bien M-x package-refresh-contents para actualizar la cache de ELPA.

Una vez hecho esto, tan solo debemos indicar a ELPA que queremos instalar magit de la siguiente forma: M-x package-install e indicarle que queremos instalar magit.

magit_from_elpa

Instalacion de magit desde ELPA

Veamos distintos ejemplos de magit y su potencia:

magit_branch_list_and_actions_over_it

Magit accediendo a distintas ramas y posibles diffs desde emacs

magit_branch_status_and_actions

Estado actual del codigo desde magit, mediante M-x magit-status, posibles acciones que se pueden realizar

magit_diff_status

Ejemplo de diffs en Magit

magit_history_log_details

Historial desde magit a nivel detallado para cada commit

magit_summary_commits_log

 Historial desde magit para commit a nivel resumen

Pero no solo eso, la potencia aqui se ve cuando se pueden combinar potencias de emacs con las de git y magit. Por ejemplo, para ver los diffs de un fichero especifico podemos emplear M-x vc-diff o bien C-x v =. Ademas podemos expandir segun nos interese los diffs mediante TAB o marcar regiones y pulsar «s» para ver ya no diffs de un fichero especifico, sino de una region concreta.

Es una pena que este video ya tenga muchos años de antiguedad, pero aqui se pueden ver algunas features de magit: http://vimeo.com/2871241

Aqui un cheat reference de magit con las funcionalidades mas importantes y sus keybindings: http://daemianmack.com/magit-cheatsheet.html#sec-7

Para mas informacion se puede visitar la web oficial de Magit: http://magit.github.io/documentation

Existen dependencias opcionales para magit, tal como stgit (similar a Quilt para patches desde/a un stack sobre git) , svn (soporte para svn-git), topgit (patch queue manager), wip (para work in progress sobre branches) o ert (automatizacion de tests).

 


Mar 29 2014

TRAMP: Transparent Remote Access, Multiple Protocols + ad-hoc multi-hop

Tag: advancedoverdrive @ 9:31 pm

TRAMP (Transparent Remote Access, Multiple Protocols) se emplea para editar ficheros de manera remota. TRAMP emplea una conexion remota mediante shell (rlogin, telnet, ssh). Puede transferir ficheros usando rcp o algun programa similar o puede codificar el contenido de los ficheros (usando uuencode o base64) y transferirlos mediante la conexion shell.

En GNU/Emacs, como no, tenemos el tramp-mode, que permite usar dicha funcionalidad desde el propio entorno.

Pudiendo asi acceder a ficheros de manera remota de una forma transparente. Ademas se puede emplear sshfs, montando asi un sistema remoto al vuelo mediante ssh o local mount, para una mayor velocidad. Desde emacs se puede emplear en este caso:

sshfs host: localmountpoint

o si el usuario es distinto mediante:

sshfs useratremotehost@host: localmountpoint -o idmapfile,uidfile=uid,gidfile=gid

 En nuestro emacs debemos anadir las siguientes lineas:

(require ‘tramp)
(setq tramp-default-method «ssh»)

Podemos usar los siguientes keybindings para hacer uso de TRAMP:

  • Especificando el host y fichero remoto: C-x C-f /remotehost:filename  RET
  • Especificando el metodo, usuario, host remoto y fichero: C-x C-f /method:usuario@remotehost:filename)
  • Especificando el usuario, host remoto y fichero: C-x C-f /usuario@remotehost:filename
  • Haciendo su para editar ficheros como root de manera local: C-x C-f /su::/etc/hosts
  • Haciendo sudo para editar ficheros como root de manera local: C-x C-f /sudo::/etc/hosts

tramp1

Ejemplo de una conexion editando un fichero remoto con TRAMP

tramp2

Region seleccionada (en rojo) de una vez editado el fichero y modificado, es guardado de la forma tipica con C-x-s.

Si poseemos versiones Emacs 24.3+, podemos emplear ad-hoc multi-hop, que reemplaza a multi de versiones anteriores. qui podemos ver la pagina info de TRAMP en emacs:

C-h i g (tramp) Ad-hoc multi-hops RET

tramp3

Emacs es autodocumentado y desde aqui podemos ver la documentacion de TRAMP

Con la nueva sintaxis, cada hop se separa mediante el simbolo del pipe ‘|‘:

  • Especificando multi-hops: C-x C-f /ssh:you@remotehost|sudo:remotehost:/path/to/file RET

O especificando el usuario en el host remoto (ya que sino por defecto se empleara root):

  • Especificando el usuario remoto en sudo con multihops: C-x C-f /ssh:you@remotehost|sudo:them@remotehost:/path/to/file RET

Tambien, debemos tener en cuenta que debemos usar su: o sudo: si estamos haciendo hoping a un servidor remoto, ademas de indicar el hostname para cada hop, incluso si es el mismo que en el hop previo. El uso de su:: y sudo:: se puede emplear cuando no usemos multiples hops.

Si ademas, queremos conectar a un puerto diferente al tipico del ssh, podemos realizarlo de la siguiente manera:

  • Especificando un puerto distinto al 22 por defecto: C-x C-f /ssh:test@host#2222:/tmp

Si queremos activar variables para debuggear problemas empleando tramp, podemos activarlas anadiendo estas lineas a nuestro .emacs:

(setq tramp-debug-buffer t)

(setq tramp-verbose 10)

Para mas informacion sobre TRAMP, se pueden consultar las siguientes webs:


Mar 24 2014

Emacs whitespace-mode

Tag: mediumoverdrive @ 10:49 pm

Whitespace-mode renderiza caracteres para que sean visibles, tales como espacios, tabulaciones o nuevas lineas.

Esto es de gran importancia especialmente cuando se emplean lenguajes como Python.

Para comenzar a usarlo tan solo debemos teclear:

 M-x whitespace-mode

Este comando hara toggle de este modo para el fichero actual. Si queremos activar/desactivar el modo a nivel global para la sesion actual de emacs deberemos lanzar:

 M-x global-whitespace-mode

whitespace1

Ejemplo de captura con whitespace-mode por defecto

  • los tabs se muestran como «>>»
  • los espacios como «.»
  • fin de linea como «$»
  • las lineas en rojo son trailing spaces
  • mientras que las lineas amarillas son «TABs» en lugar de espacios al principio de la linea.

Tambien existen otros modos utiles como:

 M-x whitespace-newline-mode
 M-x global-whitespace-newline-mode

Ahora bien, si no queremos acabar con los ojos destrozados, podemos modificar los simbolos y colores por defecto de este modo:

Para reducir los colores podemos emplear:

(setq whitespace-style (quote (spaces tabs newline space-mark tab-mark newline-mark)))

Si queremos mostrar el simbolo pilcrow en lugar del simbolo del dolar para nueva linea hariamos lo siguiente:

(setq whitespace-display-mappings
;; all numbers are Unicode codepoint in decimal. try (insert-char 182 ) to see it
 ‘(
  (space-mark 32 [183] [46]) ; 32 SPACE, 183 MIDDLE DOT 「·」, 46 FULL STOP 「.」
   (newline-mark 10 [182 10]) ; 10 LINE FEED
    (tab-mark 9 [9655 9] [92 9]) ; 9 TAB, 9655 WHITE RIGHT-POINTING TRIANGLE 「▷」
  ))

Simbolo   Unicode Code Point (Decimal)       Unicode Name
·                183                                                     MIDDLE DOT
¶               182                                                     PILCROW SIGN
↵               8629                                                  DOWNWARDS ARROW WITH CORNER LEFTWARDS
↩               8617                                                  LEFTWARDS ARROW WITH HOOK
⏎               9166                                                  RETURN SYMBOL
▷               9655                                                 WHITE RIGHT POINTING TRIANGLE
▶               9654                                                 BLACK RIGHT-POINTING TRIANGLE
→              8594                                                 RIGHTWARDS ARROW
↦               8614                                                 RIGHTWARDS ARROW FROM BAR
⇥               8677                                                 RIGHTWARDS ARROW TO BAR
⇨               8680                                                 RIGHTWARDS WHITE ARROW

 

whitespace2

Whitespace-mode tunneado para que quede mucho mas chulo que por defecto

Para eliminar los espacios en blanco al final de la linea tan solo debemos invocar a la funcion:

M-x delete-trailing-whitespace

Aunque tambien podemos anadir las siguientes lineas en nuestro .emacs, para asegurarnos de manera automatica, que cada vez cuando guardamos, no dejamos trailing spaces:

(add-hook ‘before-save-hook ‘delete-trailing-whitespace)

Referencias:
http://ergoemacs.org/emacs/whitespace-mode.html
http://www.emacswiki.org/emacs/WhiteSpace


« Página anteriorPágina siguiente »