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


Mar 09 2014

GTAGS in Emacs

Tag: mediumoverdrive @ 10:27 pm

GTACS o mas conocido como Global TAGS o simplemente GLOBAL, es una herramienta de GNU (GNU Global).

Si no disponemos de la herramienta global debemos instalarla:

# apt-get install global

Ademas de esto, debemos haber bajado alli ggtags (que se puede descargar de http://www.emacswiki.org/emacs/GnuGlobal mediante wget):

$ wget http://elpa.gnu.org/packages/ggtags-0.7.12.el

Por ultimo, en nuestro .emacs debemos anadir lo siguiente:

(add-to-list ‘load-path «~/.emacs.d/ggtags/»)
(load-file «~/.emacs.d/ggtags/ggtags-0.7.12.el»)
     (add-hook ‘c-mode-common-hook
               (lambda ()
                 (when (derived-mode-p ‘c-mode ‘c++-mode ‘java-mode)
                   (ggtags-mode 1))))

Primero nos debemos posicionar en el directorio del proyecto y tan solo debemos ejecutar (con la opcion -v para verbose o con la opcion –statistics para mostrar estadisticas):

$ gtags –statistics

gtags1

Esto generara 4 ficheros:

  • GTAGS : TAGS para definiciones
  • GRTAGS : TAGS para referencias
  • GPATH : TAGS para ficheros
  • GTAGSROOT :  Si la variable de entorno GTAGSROOT no esta asignada y el fichero GTAGSROOT existe en el mismo directorio que el fichero GTAGS, entonces global asignara GTAGSROOT al contenido del fichero.

Ademas debemos tener en cuenta el fichero de configuracion de global, que pueden ser:

  1. ‘$HOME/.globalrc’ : fichero de configuracion de global para el usuario.
  2. ‘/etc/gtags.conf’ : fichero de configuracion de global para el sistema.
  3. ‘[sysconfdir]/gtags.conf’ : Ditto.

Tenemos distintas opciones utiles para este comando:

  • -i : actualiza los ficheros TAGS de manera incremental.
  • –single-update <fichero> : actualiza los TAGS para un solo fichero.
  • –acept-dotfiles : acepta ficheros ocultos que por defecto global ignora.
  • -v : modo verbose
  • –statistics : realiza estadisticas

gtags2

Auto-completion de funciones mediante abbrev con M-C-i

Una vez construidos los ficheros tags o bien podemos usar emacs para movernos entre ellos (tan solo debemos usar M-. y M-* para saltar dentro de la definicion o volver al punto anterior. Algunos de los keybindings de Emacs mas importantes son estos:

  • M-. : encuentra definiciones
  • M-] : encuentra referencias
  • M-* : aborta (vuelve al punto previo de la llamada de manera recursiva)
  • M-n o M-p : va al siguiente o al anterior TAG
  • M-o : hace toggle de abbrev completo (en mi caso me funciona ESC + soltar ESC + TAB o Meta+Control+i).
  • M-{ o M-} : previo o siguiente fichero

Ademas pulsando F10 podemos ver un nuevo menu para GTAGS.

gtags3

Usando GTAGS en emacs, en este caso M-] para encontrar referencias

gtags4

Menu mostrado para GTAGS en C-mode (puede realizarse para cualquier modo de programacion) mediante la tecla F10

Sin embargo si desde consola queremos hacer algunos queries tambien podemos hacerlo con global:

  • global <patron> -> imprime los TAGS que coinciden con el patron.
  • global -c <patron> -> imprime simbolos que comienzan por patron.
  • global -f <fichero> -> imprime todos los TAGS de ese fichero.
  • global -u -> actualiza los TAGS de manera incremental.
  • global -x <patron> -> muestra detalles
  • global -g <patron> -> muestra en que linea se encuentra el patron especificado
  • global -r <patron> -> muestra referencias

Para mas informacion se puede consultar la pagina man global, man gtags o el manual de global: http://www.gnu.org/software/global/manual/global.html


Página siguiente »