Oct 26 2014

Offlineimap + Mu + Mu4e en emacs: alternativas modernas a gnus y rmail

Tag: advancedoverdrive @ 7:04 pm

mu4e es un moderno cliente de correo basado en el indexador/buscador de emails mu. La principal ventaja de esta herramienta es la super eficiencia a la hora de leer los correos. Entre algunas de sus funcionalidades destaca:

  • Completamente basado en busquedas: no hay directorios, solo peticiones.
  • Documentacion completa con ejemplos de configuracion.
  • La interfaz de usuario esta optimizada para velocidad con keybindings cortos para acciones.
  • Es asincrono, por lo que las acciones no bloquean emacs.
  • Soporte criptografico
  • Se emplea el texto enriquecido a la hora de escribir emails mediante org-mode
  • Permite el auto-completado basado en los mensajes previos.
  • Es extensible.

Pasos para la instalacion:

Primero debemos descargar el codigo o bien de la web https://code.google.com/p/mu0/downloads/list o bien directamente del repositorio git:

$ git clone https://github.com/djcb/mu.git
$ cd mu

Instalamos otros paquetes necesarios para la compilacion de mu4e o su uso:

$ sudo apt-get install libgmime-2.6-dev libxapian-dev gnutls-bin guile-2.0-dev html2text xdg-utils

Instalamos offlineimap y sqlite:

$ sudo apt-get install offlineimap sqlite

Configuramos, compilamos e instalamos mu (tambien se puede instalar por ejemplo desde los repositorios de debian con apt):

$ autoreconf -i
$ ./configure
$ make
$ sudo make install

Configuramos offlineimap para que pueda acceder a emails de gmail, creamos un fichero llamado .offlineimaprc en nuestro directorio de usuario:

[general]
# List of accounts to be synced, separated by a comma.
accounts = Gmail
maxsyncaccounts = 3

[Account Gmail]
# Identifier for the local repository; e.g. the maildir to be synced via IMAP.
localrepository = Gmail-local
# Identifier for the remote repository; i.e. the actual IMAP, usually non-local.
remoterepository = Gmail-remote
# Status cache. Default is plain, which eventually becomes huge and slow.
status_backend = sqlite

[Repository Gmail-local]
type = Maildir
localfolders = ~/Maildir

[Repository Gmail-remote]
type = IMAP
remotehost = imap.gmail.com
remoteuser = <TU_EMAIL@gmail.com>
remotepass = <TU_PASSWORD>
ssl = yes
maxconnections = 1
realdelete = no

folderfilter = lambda foldername: foldername in ['INBOX', 'Dev']
# Necessary as of OfflineIMAP 6.5.4
sslcacertfile = /etc/ssl/certs/ca-certificates.crt

Checkeamos que podamos acceder a nuestro email mediante mu:

$ mu index

o bien podemos probar lanzando

$ offlineimap

El output que debemos ver es algo asi.

Selection_004

Ahora anadimos las siguientes lineas de configuracion a nuestro .emacs:

;;----------------------------------------------------------
;; ---- BEGIN Email client ----
;;----------------------------------------------------------
(add-to-list 'load-path "/usr/local/share/emacs/site-lisp/mu4e")

(require 'mu4e)

;; Maildir
(setq mu4e-maildir "~/Maildir")
(setq mu4e-drafts-folder "/[Gmail].Drafts")
(setq mu4e-sent-folder   "/[Gmail].Sent Mail")
(setq mu4e-trash-folder  "/[Gmail].Trash")

;; Don't save message to Sent Messages, Gmail/IMAP takes care of this
(setq mu4e-sent-messages-behavior 'delete)

;; Setup some handy shortcuts
;; you can quickly switch to your Inbox -- press ``ji''
;; then, when you want archive some messages, move them to
;; the 'All Mail' folder by pressing ``ma''.
(setq mu4e-maildir-shortcuts
      '( ("/INBOX"               . ?i)
         ("/[Gmail].Sent Mail"   . ?s)
         ("/[Gmail].Trash"       . ?t)
         ("/[Gmail].All Mail"    . ?a)))

;; Allow for updating mail using 'U' in the main view:
(setq mu4e-get-mail-command "offlineimap")

;; Something about ourselves
(setq
 user-mail-address "your_email@gmail.com"
 user-full-name  "nickname (Your Name Here)"
 message-signature
 (concat
  "nickname (Your name here)\n"
  "Email: your_email@gmail.com\n"
  "Blog: your_blog.org\n"
  "Douban: your_website.com"
  "\n"))
(require 'smtpmail)

;; For emacs-24 you can use:
(setq message-send-mail-function 'smtpmail-send-it
    smtpmail-stream-type 'starttls
    smtpmail-default-smtp-server "smtp.gmail.com"
    smtpmail-smtp-server "smtp.gmail.com"
    smtpmail-smtp-service 587)

;; Don't keep message buffers around
(setq message-kill-buffer-on-exit t)

;; Attaching files with M-x dired and then C-c <RET> C-a
(require 'gnus-dired)
;; make the `gnus-dired-mail-buffers' function also work on
;; message-mode derived modes, such as mu4e-compose-mode
(defun gnus-dired-mail-buffers ()
  "Return a list of active message buffers."
  (let (buffers)
    (save-current-buffer
      (dolist (buffer (buffer-list t))
	(set-buffer buffer)
	(when (and (derived-mode-p 'message-mode)
		(null message-sent-message-via))
	  (push (buffer-name buffer) buffers))))
    (nreverse buffers)))

(setq gnus-dired-mail-mode 'mu4e-user-agent)
(add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode)

;; Viewing inline images
(setq mu4e-view-show-images t)
;; Use imagemagick, if available
(when (fboundp 'imagemagick-register-types)
   (imagemagick-register-types))

Checkeamos que podemos acceder a nuestro email mediante mu4e en emacs:

Selection_003

Al pulsar la «U» vemos que se esta actualizando el email. Podemos tambien cargar un speedbar con M-x speedbar

1

Lectura de emails mediante «j i» para el jump inbox. Para escribir emails simplemente pulsamos «C» de compose y para enviarlos «C-c C-c»

Referencias:

http://wenshanren.org/?p=111
http://www.emacswiki.org/emacs/mu4e
http://www.djcbsoftware.nl/code/mu/cheatsheet.html
https://github.com/djcb/mu/blob/master/README
http://www.djcbsoftware.nl/code/mu/mu4e.html
http://www.djcbsoftware.nl/code/mu/mu4e.html
http://emacs-fu.blogspot.fi/2012/08/introducing-mu4e-for-email.html
http://zmalltalker.com/linux/mu.html
http://www.djcbsoftware.nl/code/mu/mu4e/Speedbar-support.html
http://www.djcbsoftware.nl/code/mu/mu4e/Attaching-files-with-dired.html
http://www.djcbsoftware.nl/code/mu/mu4e/Writing-messages.html
http://www.djcbsoftware.nl/code/mu/mu4e/Attaching-files-with-dired.html#Attaching-files-with-dired
http://www.djcbsoftware.nl/code/mu/mu4e/Viewing-images-inline.html
http://www.emacswiki.org/emacs/mu4e


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:


« Página anteriorPágina siguiente »