May 09 2015

Sincronizacion de bookmarks con org-mode + org-protocol + org-mode capture + Firefox + linkification + Dropbox

Tag: advancedoverdrive @ 10:11 pm

Un problema con el que he convivido y al cual me he adaptado de manera incomoda durante mucho tiempo ha sido el manejo de bookmarks. Por una parte solia navegar con Firefox a pesar de que w3m es muy potente, en ciertos casos muchas webs no se abren correctamente y se hace tedioso. Ello obliga a que cualquier enlace interesante guardado en firefox, luego tenga que exportarlo de manera manual a mi fichero bookmarks.org. Una tarea bastante incomoda, porque generalmente guardamos los bookmarks rapido sin mucha atencion, acabando con cientos de ellos, ocupando gran parte del tiempo para discernir cuales son realmente interesantes para meterlos en bookmarks.org. Pero no solo eso. El problema es que en distintos ordenadores tenemos distintos firefox, teniendo asi que sincronizar multiples bookmarks guardados en firefox en un mismo fichero org. Cuando ademas reinstalamos el sistema, solemos perder dichos bookmarks, o teniendo varios ficheros .org en distintas computadoras, hace que dupliquemos bookmarks o que no tengamos la lista completa en distintos PCs.

Pensando mucho en cual era la solucion minimanete ideal, y descartando por supuesto sitios como delicious, el cual obliga a autenticarnos, guardar los bookmarks, y ademas no guardando el formato .org en cualquier caso. Necesitamos una solucion mejor. Guardar los links en un wiki tampoco solucionaba mucho la tarea, por la misma necesidad de autenticarnos y ademas guardar los links en otro formato. Y no solo eso, un ultimo problema, que es que nuestro navegador, como Firefox, reconozca de alguna manera el formato .org de emacs. Ya que si lo usamos a menudo y no solo navegamos desde emacs, lo que no queremos es abrir emacs, abrir el fichero bookmarks.org, copiar el link y pegarlo en emacs, o bien abrir emacs una vez ya estabamos navegando y abrir el fichero .org especificandole que por defecto abra el link en Firefox. Es un context switch que realmente no es comodo.

Asi que buscamos algo mas complejo de lo que originalmente podria parecer: queremos manejar orgmode para el sistema de bookmarks, queremos que ademas firefox cuando naveguemos en el, guarde automaticamente los bookmarks al pulsar unn keybinding (mediante org capture que actuara como bridge) en dicho fichero de org y se comunique con emacs (para ello usaremos org-protocol con emacserver arrancado mediante server-start). Queremos ademas que dicho fichero este sincronizado entre computadores, navegadores y entornos como emacs (para ello guardaremos el fichero en dropbox). Y ademas queremos que desde firefox tengamos un acceso directo a nuestro fichero org, y ademas que firefox interprete y parsee el fichero de texto org como enlaces que son y con un simple click podamos acceder desde el en un nuevo tab al link deseado (para ello usaremos linkification).

Comencemos instalando Dropbox para dejar el fichero de bookmarks en un lugar ideal para sincronizarlo:

$ sudo apt-get install dropbox

Instalemos los addons necesarios para firefox:

El siguiente paso es indicar en firefox donde se encontrara nuestro fichero org:

  • En firefox: View -> Toolbars -> Bookmarks toolbar
  • En firefox: Boton derecho con el raton en nuevo «Bookmarks toolbar» -> «New Bookmark» -> En «Name» poner: «Org bookmarks» y en «Location» poner: «file:///home/usuario/Dropbox/org/bookmarks.org«. Asegurarse de desactivar la casilla «Load this bookmark in the sidebar» ya que linkification no interpreta el sidebar por desgracia.

Indicamos nuestro keybinding para guardar bookmarks en firefox y que aplicacion usaremos para contactar con emacs:

  • En firefox: «Tools» -> «Addons» -> «Org mode capture» -> «Preferences» -> indicar como «emacsclient» el valor de «/usr/bin/emacsclient» y como «hotkey» el valor de «alt-r»

Ahora debemos indicarle a emacs la localizacion de nuestro fichero org y como debe comportarse cuando reciba un link mediante org-protocol. Anadiremos la siguiente configuracion en nuestro .emacs:

(server-start)
(require ‘org-protocol)

(setq org-capture-templates
      (quote ((«r» «Reference» entry (file «/home/overdrive/Dropbox/org/bookmarks.org»)
               «* %?\n\n%u\n» )
              («f» «Firefox» entry (file «/home/overdrive/Dropbox/org/bookmarks.org»)
               «* %c%?\n» )
)))

Por supuesto podemos anadir configuraciones mas avanzadas como esta otra:

(setq org-protocol-default-template-key «l»)
(setq org-capture-templates
 ‘((«t» «Todo» entry (file+headline «/home/overdrive/ALL/notes/notes.org» «Tasks»)
        «* TODO %?\n  %i\n  %a»)
   («l» «Link» entry (file+olp «/home/overdrive/ALL/notes/notes.org» «Web Links»)
        «* %a\n %?\n %i»)
   («j» «Journal» entry (file+datetree «/home/overdrive/ALL/notes/journal.org»)
        «* %?\nEntered on %U\n  %i\n  %a»)))

Para un listado de como usar los templates se puede visualizar aqui: https://www.gnu.org/software/emacs/manual/html_node/org/Template-expansion.html#Template-expansion e informacion algo mas general sobre la captura de templates aqui: https://www.gnu.org/software/emacs/manual/html_node/org/Capture-templates.html#Capture-templates.

Podeis hacer la prueba. Lanzais emacs, M-x server-start. Abris firefox, os vais a alguna web, pulsais Alt+r, vereis que emacs se abre preguntando como quereis guardar el link, pulsais «f» para indicar firefox, pulsais C-c C-c y seguis navegando. El fichero de bookmarks.org se ira actualizando. Cuando vayais a otro ordenador, con la misma configuracion, vereis los links actualizados en el fichero org.

Selection_002

Emacs se abrira en el momento de pulsar Alt+R para guardar el enlace

Selection_003

Al pulsar «f», nos insertara el link, aqui podemos modificar el formato para finalmente pulsar C-c C-c y guardarlo

Ademas, podeis pulsar en «Org bookmarks» del bookmarks toolbar de firefox y vereis como se abre a modo web el fichero org con los enlaces resaltados y clickables, los cuales al pulsar se abriran en un nuevo tab.

Selection_001

Enlaces del fichero org visibles y clickables desde firefox

Una forma distribuida de mantener actualizados vuestros bookmarks, sin necesidad de backups o de tener distintos ficheros en distintos ordenadores, sin necesidad de pensar con que navegais o con que leeis, guardais o abris los enlaces.


Nov 16 2014

Emacs + AucTeX + LaTeX Preview Pane

Tag: advancedoverdrive @ 4:22 pm

En articulos anteriores ya explique como utilizar AucTeX en emacs. El uso fundamental de AucTeX estando en LaTeX-mode es muy simple, los keybindings mas fundamentales son:

  • C-c C-c : compilamos el fichero .tex, el cual generara ficheros .dvi, pdf, etc.
  • C-c C-v : para visualizar el fichero pdf resultante, mediante alguna aplicacion externa tal que okular.

Sin embargo, y como ya explique en otros articulos anteriores, emacs tiene Doc-view, el cual esta integrado ya sin necesidad de paquetes e instalaciones externas (no como anteriormente ocurria). Es decir que si intentamos hacer un C-x C-f y abrimos un fichero .pdf podremos verlo incrustado dentro de nuestro emacs sin necesidad de aplicaciones externas.

Pero y si usasemos ese C-c C-v para visualizar el pdf compilado dentro de nuestro emacs? o mejor aun, y si al compilar o cada vez que modifiquemos nuestro fichero .tex podamos previsualizar de manera rapida en una ventana adicional los cambios realizados mostrando actualizaciones practicamente en tiempo real? Eso es precisamente lo que LaTeX Preview Pane nos ofrece.

Los pasos para comenzar a usar LaTeX Preview Pane son los siguientes:

Instalacion

En un buffer cualquiera ponemos las siguientes lineas para realizar la instalacion por medio de MELPA:

(require 'package)
(add-to-list 'package-archives
  '("melpa" . "http://melpa.milkbox.net/packages/") t)

Seleccionamos las 3 lineas y hacemos un M-x eval-buffer.

Inmediatamente despues pulsamos M-x package-install <RET> latex-preview-pane <RET>. Esto instalara LaTeX Preview Pane de manera sencilla.

Configuracion

En nuestro .emacs podemos anadir las siguientes lineas:

(setq text-mode-hook '(lambda() (flyspell-mode t) ))
(add-hook 'LaTeX-mode-hook 'flyspell-mode)
(add-hook 'LaTeX-mode-hook 'latex-preview-pane-mode)

Laslineas respecto a flyspell no son necesarias pero si recomendables, debido a que generalmente cuando escribimos texto queremos resaltar los posibles errores.

Y hacemos un M-x load-file <RET> .emacs <RET> para actualizar los cambios (la opcion alternativa es seleccionar dicha linea y evaluarla como hemos hecho con anterioridad.

Selection_004

Pantalla inicial de LaTeX Preview Pane

Uso

El uso es extremadamente sencillo, en un buffer creamos un fichero de ejemplo de LaTeX (en pangea de la Universidad de Stanford se puede encontrar un buen ejemplo).

Entonces debemos pulsar C-x C-s para guardar los cambios del buffer. Esto automaticamente hara un preview de nuestro fichero .tex en .pdf en una ventana contigua a la que estamos editando. Cada vez que guardemos el fichero .tex generara una nueva previsualizacion o bien podemos forzar un update del visualizado con M-p. Ahora si pulsamos C-c C-c realizara una compilacion y previsualizacion externa (por ejemplo con okular). O bien si pulsamos C-c C-v realizara una previsualizacion externa de la compilacion anteriormente realizada. Aunque realmente esto ya no sera necesario por norma general. Y aqui tenemos el resultado:

overdrive@apocalipsis.blackhats.es:-home-overdrive-latexexample.pdf_002

LaTeX Preview Pane previsualizando a la derecha en cada C-x C-s que se produzca en el buffer de la izquierda

Para el autocompletado podemos usar los siguientes keybindings (los primeros son los 3 principales para este modo):

  • Ctrl+TAB : Activara TeX-Complete-Symbol.
  • C-M-/ : Activara dabbrev-completion.
  • TAB : activara el spell de emacs.
  • C-M-i o ESC TAB : Completion normal de emacs, activa corrections.
  • M-/ : Activa el default completion de emacs.
  • C-c C-m : Activa el TeX-Insert-Macro de emacs.

Algunas referencias adicionales usadas en este articulo:

  • Emacs wiki LaTeX Preview Pane: http://www.emacswiki.org/emacs/LaTeXPreviewPane
  • Official website of LaTeX Preview Pane: https://github.com/jsinglet/latex-preview-pane
  • Discusion relacionada en tex.stackexchange.com: http://tex.stackexchange.com/questions/190882/what-is-the-best-side-by-side-preview-method-for-emacs24-auctex
  • Ejemplos de LaTeX: https://pangea.stanford.edu/computing/unix/formatting/latexexample.php

Para informacion fundamental de LaTeX se puede consultar:

  • LaTeX quick overview: http://www.aps.org/meetings/abstract/latex.cfm

Para informacion basica adicional de LaTeX:

  • LaTeX Primer: http://www.maths.tcd.ie/~dwilkins/LaTeXPrimer/
  • The Very basics of LaTeX: http://www.cs.nyu.edu/courses/spring05/V22.0480-005/latex.html
  • LaTeX basics for students: http://www.cs.nyu.edu/~yap/student/LatexBasics.html
  • LaTeX basics: http://www.stat.pitt.edu/stoffer/freetex/latex%20basics.pdf
  • Basic LaTeX: http://www.math.wisc.edu/~mitchell/learntex.pdf

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


« Página anteriorPágina siguiente »