Nov 09 2014

Emacs + Calc: La supercalculadora de emacs (I)

Tag: advancedoverdrive @ 6:51 pm

Vista General

La calculadora GNU/Calc que se incluye en GNU/Emacs es una supercalculadora basada en la serie HP-28/48. Algunas de sus caracteristicas son:

  • Se puede emplear notacion algebraica o bien notacion polaca inversa o RPN (basada en un stack).
  • Precision arbistraria para numeros enteros y de coma flotante.
  • Aritmetica en numeros raciones, numeros complejos (rectangulares y polares), formularios de error con desviaciones estandar, intervalos abiertos y cerrados, vectores y matrices, fechas y tiempos, infinitos, sets, cantidades con unidades y formulas algebraicas.
  • Operaciones matematicas como logaritmos y funciones trigonometricas.
  • Funcionalidades para programadores (operaciones a nivel de bit, numeros no decimales).
  • Funciones financieras como valores futuros y retorno de tasas de intervalos.
  • Funcionalidades de teoria de numeros como factorizacion de numeros primos y aritmetica modular m para cada m.
  • Funciones para manipulacion algebraica, incluyendo calculo simbolico.
  • Flujo de datos de y hacia edicion de buffers regulares.
  • Modo embedded para manipulacion de formulas de calculo y datos directamente dentro del buffer editado.
  • Graficos empleando GNUPlot.
  • Facil programacion mediante el uso de macros de teclado, formulas algebraicas, reescritura de formulas algebraicas o extension mediante Elisp.

Ejecutando calc y ayuda

Para comenzar a usar calc tan solo debemos lanzar M-x calc o bien C-x * c. Tambien podemos lanzar el tutorial general con C-x * t. Los keybindings que normalmente usamos para buscar funciones, keybindings o variables se pueden usar con el scope solo de calc si pulsamos:

  • h i : info de calc.
  • h k : keybindings de calc.
  • h f : funciones de calc.
  • h v : variables de calc.

Cuando abrimos calc la interfaz que tenemos nos divide el frame en  3 ventanas. La de arriba con el fichero que teniamos abierto originalmente y las dos de abajo de las cuales la de la izquierda es llamado el «stack window» (la cual mantiene los numeros empleados para calculo) y la de la derecha llamada «trail window» (el cual mantiene la lista de calculos realizados previamente).

Funciones mas generales en calc (sin entrar en funciones con prefijos)

Algunas de las funciones que la calculadora permite realizar (este listado se puede sacar mediante C-h m una vez estando en calc):

0 .. 9          calcDigit-start
C-d             calc-pop
TAB             calc-roll-down
C-j             calc-over
C-k             calc-kill
RET             calc-enter
C-w             calc-kill-region
C-y             calc-yank
ESC             Prefix Command (Pulsar ? despues para ver el listado de keybindings)
SPC             calc-enter
!               calc-factorial
»               calc-auto-algebraic-entry
#               calcDigit-start
$               calc-auto-algebraic-entry
%               calc-mod
&               calc-inv
‘               calc-algebraic-entry
(               calc-begin-complex
)               calc-end-complex
*               calc-times
+               calc-plus
,               calc-comma
–               calc-minus
.               calcDigit-start
/               calc-divide
:               calc-fdiv
;               calc-semi
<               calc-scroll-left
=               calc-evaluate
>               calc-scroll-right
?               calc-help
@               calcDigit-start
A               calc-abs
B               calc-log
C               calc-cos
D               calc-redo
E               calc-exp
F               calc-floor
G               calc-argument
H               calc-hyperbolic
I               calc-inverse
J               calc-conj
K               calc-keep-args
L               calc-ln
M               calc-more-recursion-depth
N               calc-eval-num
O               calc-option
P               calc-pi
Q               calc-sqrt
R               calc-round
S               calc-sin
T               calc-tan
U               calc-undo
V               Prefix Command para vec/mat (Pulsar ? despues para ver el listado de comandos)
X               calc-call-last-kbd-macro
Y               Prefix Command
Z               Prefix Command para user (Pulsar ? despues para ver el listado de comandos)
[               calc-begin-vector
\               calc-idiv
]               calc-end-vector
^               calc-power
_               calcDigit-start
`               calc-edit
a               Prefix Command para algebra (Pulsar ? despues para ver el listado de comandos)
b               Prefix Command para binary/bus (Pulsar ? despues para ver el listado de comandos)
c               Prefix Command para convert (Pulsar ? despues para ver el listado de comandos)
d               Prefix Command para display (Pulsar ? despues para ver el listado de comandos)
e               calcDigit-start
f               Prefix Command para functions (Pulsar ? despues para ver el listado de comandos)
g               Prefix Command para graph (Pulsar ? despues para ver el listado de comandos)
h               calc-help-prefix
i               calc-info
j               Prefix Command para select (Pulsar ? despues para ver el listado de comandos)
k               Prefix Command para combinatorics (Pulsar ? despues para ver el listado de comandos)
l               Prefix Command para long units (Pulsar ? despues para ver el listado de comandos)
m               Prefix Command para mode (Pulsar ? despues para ver el listado de comandos)
n               calc-change-sign
o               calc-realign
p               calc-precision
q               calc-quit
r               Prefix Command para recall/register (Pulsar ? despues para ver el listado de comandos)
s               Prefix Command  para store (Pulsar ? despues para ver el listado de comandos)
t               Prefix Command para trail/time (Pulsar ? despues para ver el listado de comandos)
u               Prefix Command para units/stat (Pulsar ? despues para ver el listado de comandos)
v               Prefix Command para vec/mat (Pulsar ? despues para ver el listado de comandos)
w               calc-why
x               calc-execute-extended-command
y               calc-copy-to-buffer
z               Prefix Command para user
{               calc-scroll-down
|               calc-concat
}               calc-scroll-up
~               calc-num-prefix
DEL             calc-pop
<mouse-2>       calc-yank
<remap>         Prefix Command
C-x C-t         calc-transpose-lines
C-M-d           calc-pop-above
C-M-i           calc-roll-up
M-RET           calc-last-args
C-M-w           kill-ring-save
M-%             calc-percent
M-k             calc-copy-as-kill
M-m             Prefix Command para algebraic mode
M-w             calc-copy-region-as-kill
M-DEL           calc-pop-above
M-m ESC         Prefix Command
M-m t           calc-total-algebraic-mode
V ESC           Prefix Command para vec/mat (Pulsar ? despues para ver el listado de comandos)

Prefijos (e.g. display/notacion)

Notese que cada uno de los comandos que son «Prefijos» se pueden combinar con «?» o «C-h» para conocer la lista de comandos, funciones u opciones que se pueden ejecutar con dichos prefijos. Por ejemplo un prefijo interesante es el que hace set de la notacion:

  • d : prefix de modos de display o notacion:
    • d 0             calc-decimal-radix
      d 2             calc-binary-radix
      d 6             calc-hex-radix
      d 8             calc-octal-radix
      d ?             calc-d-prefix-help (para rotar con el resto de modos posibles)
      d E             calc-eqn-language
      d c             calc-complex-notation
      d d             calc-date-notation
      d e             calc-eng-notation
      d f             calc-fix-notation
      d n             calc-normal-notation
      d o             calc-over-notation
      d p             calc-show-plain
      d r             calc-radix
      d s             calc-sci-notation
      d Control+h   para ver el resto de modos listados

Quick mode

Si no necesitamos todas estas funciones tan extensas, podemos lanzar calc en modo quick o rapido mediante C-x * q o bien invocarlo mediante M-x quick-calc. Por ejemplo podemos poner 666 inmediatamente y nos dara la conversion en hexadecimal, octal y binario respectivamente o bien podemos poner una operacion por ejemplo 2+2 directamente.

Keypad mode

Con M-x calc-keypad o C-x * k  podremos activar/desactivar el keypad o teclado, desde el cual podremos usar el raton y pulsar en el directamente. Podemos ademas activar el keypad mode en modo full o lo que es lo mismo llamando a la funcion M-x full-calc-keypad o C-x * b, tendremos el teclado con la calculadora a pantalla completa a nuestra disposicion, para salir de dicho modo podemos pulsar simplemente q.

Embedded mode

Se emplea para poder emplear la calculadora desde dentro de un buffer directamente. Por ejemplo si tenemos en un buffer una expresion tal que asi:

     The derivative of
     
                                        ln(ln(x))
     
     is
     
                                        ln(ln(x))

 

Podemos mover el cursor a la segunda formula y pulsar C-x * e. Veremos que nos cambia la formula y nos pone en el modeline algo tal que asi «12 Deg». Si ahora pulsamos a d x <RET> entonces veremos el resultado del calculo y reemplazara la formula por dicho resultado. Para que esto quede mejor, podemos pulsar incluso ahora d = para centrar la formula o bien d B para big display mode. Tendremos el siguiente resultado:

The derivative of ln(ln(x)) is
% [calc-mode: justify: center]
% [calc-mode: language: big]

1
——-
x ln(x)

Calc anade anotaciones para ayudar a recordar los modos que fueron usados para dicha formula. Dichas anotaciones estan formateadas en lenguaje TeX. Como colofon final podemos pulsar d } (1) <RET> y anadir asi un identificador de ecuacion a modo etiqueta. El resultado quedaria tal que asi:

Selection_001

Para salir de este modo tan solo debemos pulsar de nuevo C-x * e.

Otros comandos C-x *

  •  * : encender/apagar calculadora.
  •  C : encender/apagar calculadora usando la interfaz standard.
  •  O : exactamente igual que C, pero sin seleccionar nueva ventana calc.
  •  B : full screen.
  • Q : usa el quick mode para calculos rapidos.
  • K : keypad on/off.
  • E : embedded modo on/off para la formula actual.
  • J : embedded modo on/off para la seleccion actual.
  • W : embedded modo on/off para la palabra actual.
  • Z : embedded modo on/off para la definicion actual del usuario.
  • X : sale de calc de cualquiera de los modos que este.

Comandos para mover datos dentro de la calculadora:

  • G : guarda los datos de una region y los almacena en un vector.
  • R : guarda los datos de una region rectangular y los almacena en un vector.
  • : : guarda los datos de una region, los computa y los almacena en un vector.
  • : guarda los datos de una region, los computa y los almacena en una matriz.
  • Y : pega (yank) un valor de la calculadora en el buffer de edicion actual.

Otros comandos para usarlos con la calculadora incrustada (embedded):

  • A : activa el buffer actual y busca las formulas que contengan simbolos tal que «:=» o «=>», guarda sus localizaciones para cuando las variables cambien de valor se actualicen automaticamente.
  • D : duplica la formula actual inmediatamente debajo.
  • F : inserta una formula en el punto actual.
  • N : mueve el cursor a la siguiente formula.
  • P : mueve el cursor a la formula anterior.
  • U : actualiza la formula en el punto actual.
  • ` : edita la formula en el punto actual.

Otros comandos (misc):

  • I : ejecuta la pagina info del manual de calc.
  • T : ejecuta la pagina info del tutorial de calc.
  • S : ejecuta la pagina info del calc summary.
  • L : carga calc completamente en memoria (normalmente solo se cargan las partes que se necesitan en cada momento).
  • M : lee una region de nombres de keystrokes escritos y los guarda para la macro actual.
  • 0 : reinicia la calculadora en el estado inicial (vacia el stack y deja los valores de modo iniciales).

La lista de comandos mas utiles o tipicos se pueden encontrar en la  GNU Reference card gnu calc reference card.

Para mas informacion, se puede consultar este extenso tutorial sobre GNU Calc: http://www.gnu.org/software/emacs/manual/html_mono/calc.html#Tutorial


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).

 


« Página anteriorPágina siguiente »