Dic 09 2009

Org-mode : Hiperenlaces

Tag: basicoverdrive @ 1:45 am

Org permite guardar enlaces y que sean accesibles de forma click-able. El formato general es:

[[link][descripcion]        alternativa          [[link]]

Una vez todos los corchetes esten presentes, la descripcion sera mostrada, asi como el enlace. La forma que se usa para resaltarlos es mediante la variable org-link, que por defecto es subrayado. Es posible modificar tanto el link como su descripcion pulsando las teclas C-c C-l. Para borrar el enlace tan solo debemos poner el cursor al principio de la linea y pulsar BACKSPACE.

Enlaces internos

El link puede ser interno (y no una URL) para ello debemos crear identificadores y ser responsables de mantener un unico identificador diferente para cada enlace interno, por ejemplo si anadimos esta linea:

# <<<Mi objetivo>>>

Podremos referenciar a dicho enlace interno creando lo siguiente:

[[Mi objetivo]]

o bien

[[Mi objetivo]][[Buscar mi objetivo]]

Para acceder a los enlaces debemos presionar C-c C-o o bien hacer click con el raton. Tambien es posible exportarlos como enlaces HTML mediante HTML export (el cual comentaremos mas adelante).

Si el enlace no existe como tal, org buscara enlaces que comiencen por el mismo patron (es decir *Mi objetivo) y mostrara los resultados solo si coincide completamente, pudiendo acceder a cada uno de ellos o bien volviendo atras mediante C-c &.

Es posible crear enlaces usando botones de radio mediante (solo seran cargados cuando se cargue el fichero org la primera vez o bien pulsando C-c C-c):

<<<Mi objetivo>>>

Enlaces externos

Org permite enlazar a ficheros, webs, usenet, mails, entradas de bases de datos, e incluso conversaciones de irc o sus logs. Todos los enlaces externos comienzan por la palabra clave que identifica el tipo de enlace externo seguido por los dos puntos y el propio enlace, por ejemplo:

http://www.blackhats.es/    Una web
file:/home/overdrive/org.txt    Un fichero con PATH absoluto
/home/overdrive/org.txt        Igual que arriba
file:documentos/ultimo.pdf    Un fichero con PATH relativo
./documentos/ultimo.pdf        Igual que arriba
file:alguntexto::NNN        Una linea donde saltar dentro de un fichero
file:projects.org        Enlace a otro fichero org
file:projects.org::foo bar    Busqueda de texto en un fichero org
file.projects.org::*task bar    Busqueda de cabecera en un fichero org
id:B742456-2EAS-4FGHDF-345BZ    Enlace a un identificador
news:comp.emacs            Enlace a usenet
mailto:zoom@blackhats.es    Enlace a un correo
vm:carpeta            Enlace VM a una carpeta
vm:carpeta#id            Enlace VM a un mensaje
vm://yo@al.site.org/carpeta#id     Enlace VM a un identificador de una maquina remota
wl:carpeta            Enlace WANDERLUST a una carpeta
wl:carpeta#id            Enlace WANDERLUST a un id de una carpeta
mhe:carpeta            Enlace MH-E a una carpeta
mhe:carpeta#id            Enlace ME-E a un id de una carpeta
rmail:carpeta            Enlace rmail a una carpeta
rmail:carpeta#id        Enlace rmail a un id de una carpeta
gnus:grupo            Enlace gnus a un grupo
gnus:grupo#id            Enlace gnus a un id de un grupo
bbdb:R.*Stallman        Enlace BBDB con expresion regular (regexp)
irc:/freenode.net/#emacs/over    Enlace IRC
shell:ls *.org            Enlace a un comando shell
elisp:org-agenda        Enlace a un comando interactivo Elisp
elisp:(find-file-other-frame «elisp.org»)   Enlace a un formulario lisp a evaluar

Los enlaces deben ser cerrados con doble corchete y deben contener un texto descriptivo en lugar de mostrar la URL:

[[http://www.gnu.org/software/emacs/][GNU Emacs]]

Es posible poner como descripcion una URL o una imagen que luego puede ser mostrada inline. Ademas para evitar problemas con espacios o ciertas palabras reservadas es posible mediante el entrecomillado simple por ejemplo:

‘bbdb:Richard Stallman’

Administracion

C-c l : Si queremos insertar un enlace (ya sea para buffers, VM, rmail, Wanderlust, MH-E, gnus, navegadores como W3 o W3M, contactos BBDB, irc, agenda u otros ficheros).
C-c C-l : Inserta un enlace de forma interactiva sobre el cursor (permitiendo usar autocompletion con TAB)
C-u C-c C-l : Inserta un enlace usando fichero que sera insertado.
C-c C-o ó RET : Abre un enlace.
C-u C-u C-c C-o : Abre un enlace evitando emacs.
C-c % : Mete la posicion actual en el mark-ring.
C-c & : Salta a una posicion guardada.
C-c C-x C-n : Se desplaza al siguiente enlace en el buffer.
C-c C-x C-p : Se desplaza al enlace anterior en el buffer.

Se puede bindear a C-n y C-p anadiendo las siguientes lineas en nuestro .emacs:

(add-hook ‘org-load-hook
(lambda ()
(define-key ‘org-mode-map «\C-n» ‘org-next-link)
(define-key ‘org-mode-map «\C-p» ‘org-previous-link)))

Usando enlaces

Se pueden insertar las siguientes lineas en nuestro .emacs para acceder a los enlaces fuera de org:

(global-set-key «\C-c L» ‘org-insert-link-global)
(global-set-key «\C-c o» ‘org-open-at-point-global)

Abreviaturas

Se pueden usar abreviaturas para evitar tener que escribir mas de la cuenta, por ejemplo:

[[linkword:tag][descripcion]]

Donde ‘tag‘ es opcional y linkword debe ser un caracter alfanumberico o ‘_‘ o ‘‘. En lugar de tener que repetir dicha linea muchas veces podemos hacer cosas como:

(setq org-link-abbrev-alist
‘((«bugzilla» . «http://10.1.2.9/bugzilla/show_bug.cgi?id=»)
(«google»   . «http://www.google.com/search?q=»)
(«ads»         . «http://adsabs.harvard.edu/cgi-bin/nph-abs_connect?author=%s&db_key=AST»)))

Para el primer caso podemos enlazar un bug con [[bugzilla:129]], para el segundo caso podriamos usar [[google:OrgMode]] y para el ultimo caso podriamos usar [[ads:Dominik,C]] que reemplazara el contenido la cadena ‘%s‘ por el tag.

Para realizar abreviaturas para un fichero especifico podemos usar:

#+LINK: bugzilla http://10.1.2.9/bugzilla/show_bug.cgi?id=
#+LINK: google     http://www.google.com/search?q=%s

Ademas es posible usar completion para abreviaturas despues de escribir ‘[‘.

Opciones de busqueda

Los enlaces pueden contener cierta informacion a la hora de saltar en un enlace particular, como por ejemplo el numero de linea, una expresion regular, etc… por ejemplo:

[[file:~/codigo/main.c::255]]
[[file:~/xx.org::My objetivo]]
[[file:~/xx.org::*My objetivo]]
[[file:~/xx.org::/expresion_regular/]]

Busquedas personalizadas

Es posible modificar y personalizar las busquedas para buscar enlaces en ficheros con una extension particular hookeando variables como org-create-file-search-functions y org-execute-file-search-functions, tambien es interesante ver el mecanismo que usa org-mode para buscar en bases de datos BibTeX, para ello es posible ver la implementacion en org-bibtex.el.


Dic 08 2009

Org-mode : Tablas

Tag: basicoverdrive @ 2:23 pm

Debido a la extension de org-mode y la importancia que esta teniendo con todo el proceso activo de desarrollo, he decidido dividir el post de org-mode segun el tema tratado. En este primer post hablare de como trabajar con tablas en org-mode.

Definicion de tablas

Las tablas en org-mode se tratan en ASCII plano, cada linea que comience por ‘|‘ (pipe) sera considerada parte de una tabla. Dicho simbolo se considerara el separador de columna. Las tablas son re-alineadas cada vez que se pulsa TAB o INTRO o C-c C-c dentro de la tabla. TAB tambien se emplea para moverse al siguiente campo e INTRO para moverse a la siguiente columna.

Para crear una tabla debemos escribir por ejemplo:

|Name|Phone|Age|
|-

Y pulsar TAB para crear la tabla o bien se puede escribir directamente |Name|Phone|Age y presionar C-c INTRO.

DEL y Backspace se emplean para eliminar campos. S-TAB o INTRO se emplean para dejar el campo en blanco.

Creacion

  • C-c | : Convierte una region activa en una tabla, tomando los TAB como separaciones o usando CSV, en caso de no encontrar ninguno de los dos usara los espacios como separador.
  • C-u C-c | : Fuerza el uso de CSV.
  • C-u C-u C-c | : Fuerza el uso de TAB.
  • C-numero C-c | : Fuerza el uso de un numero determinado de espacios.

    Alineacion

    • C-c C-c : Re-alinea una tabla sin mover el cursor.
    • TAB : Re-alinea una tabla, moviendo el cursor al siguiente campo creando una nueva fila si es necesario.
    • S-TAB : Re-alinea una tabla moviendose a la fila anterior.
    • INTRO : Re-alinea una tabla y se desplaza a la siguiente fila creando una nueva fila si es necesario o separando una tabla en dos si se efectua entre dos filas.
    • M-a : Se desplaza al campo anterior.
    • M-e : Se desplaza al siguiente campo.

      Edicion de filas y columnas

      • M-<– o M–> : Se desplaza una columna a la izquierda/derecha.
      • M-S-<– : Elimina la columna actual.
      • M-S—> : Inserta una nueva columa a la derecha del cursor.
      • M-up o M-down : Se desplaza a la fila anterior/posterior.
      • M-S-up : Elimina la fila actual.
      • M-S-down : Inserta una nueva fila sobre la fila actual. Si se emplea con el prefijo, la creara debajo.
      • C-c – : Inserta una linea horizontal para la fila actual. Si se emplea con el prefijo insertara la linea horizontal encima de la linea actual.
      • C-c INTRO : Inserta una linea horizontal debajo de la fila actual y mueve el cursor a dicha fila.
      • C-c ^ : Ordena la region de una tabla (alfabeticamente, numericamente o por fecha). Si es llamado con un argumento lo hara case-sensitive.

      Regiones

      • C-c C-x M-w : Copia una region de una tabla e ignora los puntos y marcas que determinan la tabla. ‘Copiar’.
      • C-c C-x C-w : Copia una region de una tabla y deja en blanco todos los campos del rectangulo. ‘Cortar’.
      • C-c C-x C-y : Pega una region en una tabla y redimensiona la tabla si es necesario. ‘Pegar’.
      • M-INTRO : Ajusta en distintas lineas columnas que excedan el ancho. Si se realiza sobre una region el texto sera ajustado a la region minima del ancho dado especificando un numero de filas deseadas mediante prefijos. Si se realiza fuera de una region el campo actual sera dividido en la posicion donde se encuentre el cursor o bien si se realiza fuera de una region y usando prefijos dejara el campo en blanco y el contenido del mismo quedara en el campo previo.

      Calculos

      • C-c + : Suma los numeros de la columna actual, de un rectangulo definido o bien de una region activa, el resultado es mostrado en ‘echo area’ o minibuffer y puede ser insertado con C-y.
      • S-INTRO : Cuando el campo actual esta vacio, copia desde el primero que no lo esta, si no esta vacio copiara el campo actual. Lo pegara en la siguiente fila y movera el cursor a ella. Valores enteros seran incrementados durante dicha copia (campos autonumericos) excepto si son demasiado grandes. Usando argumentos con prefijo 0 deshabilitara el incremento.

      Miscelanea

      • C-c ` : edita el campo actual en una ventana distinta. Usando el prefijo C-u hara que se vea el campo de forma completa.
      • M-x org-table-import : importa una tabla de un fichero. La tabla debe usar TAB o espacios como separadores.
      • C-c | : importa una tabla usando pegado de texto tabular (C-x C-x).
      • M-x org-table-export : exporta una tabla a un fichero. La tabla usara el TAB por defecto como separador.

      Para deshabilitar el editor automatico de tablas podemos anadir a nuestro .emacs:

      (setq org-enable-table-editor nil)

      De aqui en adelante solo C-c C-c hara una re-alineacion manual.

      Columnas estrechas

      El ancho de la columna es determinado por el editor de tablas. Para limitar el ancho de una columna debemos tener un campo llamando ‘<N>‘ donde N es el ancho maximo de caracteres por columna. Las columnas que sean mas anchas se acortaran y anadiran «=>» indicando que hay mas texto, que podra ser mostrado mediante C-c ` (que edita) o mediante un tooltip. Para salir de la edicion deberemos pulsar C-c C-c.

      Podemos colocar alineacion automatica al inicio medinate org-startup-align-all-tables o en el fichero de arranque mediante:

      #+STARTUP: align
      #+STARTUP: noalign

      Grupos de columnas

      Es posible usar tipos especiales de columnas y agruparlos si la primera columna comienza por ‘/‘ para indicar que queremos agrupaciones; ‘<‘ indicara el inicio de grupo, ‘>‘ el final del grupo, ‘<>‘ indica su propio grupo (uno solo).

      Org-table como modo menor

      Tan solo debemos anadir a nuestro .emacs:

      (add-hook ‘mail-mode-hook ‘turn-on-orgtbl)

      Esto tiene utilidad si queremos construir por ejemplos tablas mediante el uso de LaTeX, etc… pudiendo asi combinar un modo mayor para un lenguaje o similar al mismo tiempo que se usan tablas de org como modo menor.


      Dic 01 2009

      GPG en Emacs

      Tag: basicoverdrive @ 11:31 pm

      EasyPG es una funcionalidad incluida dentro del paquete emacs que nos permite acceder a las funcionalidades de GPG (GnuPG). Al estar integrado, no necesitamos ninguna instalacion adicional mas que incluir en nuestro .emacs la siguiente configuracion:

      ;; EasyPG (GPG for emacs)
      (require ‘epa)
      (require ‘epa-file)
      (epa-file-enable)

      ; EPG support for GNUS
      (setq gnus-treat-x-pgp-sig t
      mm-verify-option ‘always
      mm-decrypt-option ‘always)

      Existen distintas formas para usar esta funcionalidad para cifrar, pero antes debemos generar nuestro par de claves privada y publica en caso de que queramos cifrar para nosotros mismos documentos o bien importar claves de algun servidor de claves para poder cifrar documentos que luego enviaremos a algun receptor. Pero antes un poco de cultura general, debido a la desinformacion al respecto y aprovechando dicho articulo, asi que pongo un texto que lei hace un tiempo:

      El Diccionario de la Real Academia Española da los siguientes resultados:

      cifrar.

      1. tr. Transcribir en guarismos, letras o símbolos, de acuerdo con una clave, un mensaje cuyo contenido se quiere ocultar.

      2. tr. Valorar cuantitativamente, en especial pérdidas y ganancias.

      3. tr. Compendiar, reducir muchas cosas a una, o un discurso a pocas palabras. U. t. c. prnl.

      4. tr. Reducir exclusivamente a una cosa, una persona o una idea determinadas lo que ordinariamente procede de varias causas. Cifrar la dicha en la estimación pública. Cifrar la esperanza en Dios.

      encriptar.

      La palabra encriptar no está en el Diccionario.

      “Encriptar” no suena correcto porque las palabras españolas que derivan de κρυπτός (”oculto”) se forman de manera diferente:

      Viendo “criptografía”, “criptograma”, “críptico”, “criptógamo”, “criptoanálisis”, etc. la raíz es “cripto” o “cripti” con lo que, siguiendo las reglas de fonética y formación del español, la palabra debería ser (inventadas) “encripticar”, “criptificar” o –más probablemente– “criptografiar”.

      “Cripta” viene del griego κρύπτη, sustantivo femenino en η que significa “sótano” o “lugar bajo tierra”, luego pasó por el latín y adquirió el tinte mortuorio. El lexema de “encriptar” es “cripta”, luego parece correcto decir que “encriptar”, de significar algo, es “meter en la cripta” o “meter bajo tierra” (como “sepultar”, que también tiene connotación de “ocultar”).

      “Sifr” es “cifra” y “cifrar”, por lógica, sería “poner en números”, “numerar”, etc. Teniendo en cuenta que los criptosistemas se han basado siempre en el tratamiento numérico de los mensajes pues su uso no está demasiado desencaminado, etimológicamente hablando.

      Por lo tanto, encriptar en si no existe, y si tuviera un significado sería el de “meter en una cripta”, y cifrar sería el termino más correcto.

      Aún asi, y debido a las influencias del inglés, sobre todo en la informatica, se usa la palabra encriptar y se acepta aunque sea incorrecto, por lo que se pueden utilizar ambos terminos según quiera cada uno pero teniendo en cuenta cual es el termino correcto si se quiere demostrar un poco de “culturilla” (que falta hace con la generación HOYGAN que hay hoy dia..).

      Para comenzar a utilizar esta funcionalidad en emacs tan solo debemos editar un fichero con extension .gpg, insertar cualquier texto y al salir, nos pedira guardarlo, pero esta vez usando una clave publica que debemos haber generado previamente. Aunque la finalidad de este articulo es el uso de GPG bajo emacs, creo que es interesante informar de los comandos esenciales de GPG de forma breve, para poder poner este articulo en practica sin errores por falta de una clave importada o por no haber generado las claves:

      Generar una clave (escoged RSA + ElGamal)

      gpg –gen-key

      Enviar nuestra clave a un servidor PGP/GPG

      gpg –send-keys –keyserver pgp.rediris.es CLAVEID_O_MAIL

      Buscar claves en servidores

      gpg –keyserver pgp.rediris.es –search-keys CLAVEID_O_MAIL

      Ver las claves en rediris o cualqueir otro server (todos estan conectados entre ellos) mediante web

      http://www.rediris.es/keyserver/

      Importar una clave de un servidor

      gpg –keyserver pgp-rediris.es –recv-key CLAVEID_O_MAIL

      Importar una clave de un fichero

      gpg –import suclave.asc.pub

      Abrir GPG subshell para modificar nuestra clave y otra informacion

      gpg –edit-key CLAVEID_O_MAIL

      Una vez hayamos generado nuestro par de claves publica/privada o bien hayamos importado alguna clave publica de algun conocido, ya podemos poner en practica EasyPG. Tenemos 3 formas basicas de cifrar:

      1. Si creamos o abrimos un fichero con extension .gpg desde emacs, escribimos un texto en el, y al guardar dicho fichero se nos pedira que clave queremos usar para cifrarlo (nos mostrara una lista en una ventana aparte). Una vez seleccionado el mensaje sera cifrado. Si salimos de emacs veremos que desde consola el fichero es ilegible, es decir esta cifrado. Si abrimos esta vez el fichero .gpg con emacs nos pedira la contrasena para usar la clave privada para asi poder descifrarlo, haciendo de este legible otra vez.
      2. Podemos cifrar desde consola mediante el comando gpg por ejemplo (la opcion –armor cifrara dejando en el fichero de salida un formato ASCII, si no se especifica dicha opcion el fichero de salida sera un fichero binario):
        • gpg –armor –recipient CLAVEID –encrypt fichero_a_cifrar
        • gpg –armor –output fichero_cifrado –recipient CLAVEID –encrypt fichero_a_cifrar
      3. Podemos desde emacs seleccionar una region de un buffer (o el buffer completo como se desee) y presionando M-x epa-encrypt-region. Para descifrar realizaremos el mismo proceso de seleccionar una region cifrada y presionando M-x epa-decrypt-region.

      Podemos asociar a dichas funciones algun keystroke para acelerar dicho proceso si lo hacemos de forma habitual, en mi caso lo asocie a las teclas F11 para cifrar y F12 para descifrar:

      ;; To cipher a region
      ;; M-x epa-encrypt-region OR global F11
      (global-set-key [f11] ‘epa-encrypt-region)
      ;; To uncipher a region
      ;; M-x epa-decrypt-region OR global F12
      (global-set-key [f12] ‘epa-decrypt-region)

      « Página anteriorPágina siguiente »