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)

      Nov 30 2009

      Stumpwm

      Tag: basicoverdrive @ 9:56 pm

      Stumpwm es un window manager minimalista, probablemente el mas minimalista de todos debido a que intenta ser lo mas configurable posible (incluyendo en tiempo real) manteniendo una apariencia visual minima. En Stumpwm no existen decoraciones de ventanas, tampoco iconos ni botones, y ningun fondo por defecto o degradado, simplemente la misma percepcion que se tiene de las X lanzadas ‘a pelo’. Simplemente se configura de forma personal mediante hooks y modificando algunos valores de variables.

      Por cierto Stumpwm esta intimamente relacionado con emacs; primero porque esta integramente escrito en lisp y es configurable en tiempo real, evaluando las expresiones de algo que esta ejecutandose en dicho momento y modificando por tanto su codigo y datos. Y segunda porque tiene ciertos keybindings asociados directamente y por defecto a nuestro entorno favorito, emacs.

      Stumpwm se puede interpretar de dos formas, o bien haciendo uso de clisp (Common Lisp) o sbcl (Steal Bank Common Lisp, dialecto de Lisp y variante de CL). Por defecto si usamos el apt de debian empleara clisp, aunque yo recomiendo encarecidamente usar sbcl, requerido por ejemplo para el uso de xinerama con pantalla extendida para doble monitor, como es mi caso (recordad que el uso de 2 pantallas aumenta la productividad de manera significativa, asi que esto es importante).

      Si habeis tenido el error de meter clisp mediante apt-get y ahora quereis meter sbcl, debemos limpiar ciertos directorios que apt-get install –remove –purge no habra realizado. Como por ejemplo eliminar el contenido del directorio /var/cache/common-lisp-controller/.

      # rm -Rf /var/cache/common-lisp-controler/*

      Ademas desde hace un par de semanas hasta ahora, existe un conflicto (no confundir con bug) desde que estan siendo retirados algunos scripts lisp en debian, y deberemos substituir el script asdf que se encuentre en el source de stumpwm (en caso de que instalemos stumpwm desde git). Asi que primero nos disponemos a bajar la ultima version de stumpwm en desarrollo:

      $ git clone git://git.savannah.nongnu.org/stumpwm.git

      Una vez hecho esto entramos en el directorio creado que por defecto es stumpwm:

      $ cd stumpwm

      Este es un paso adicional requerido solo en caso de que persista el conflicto de asdf.el que trae stumpwm (eso solo se puede saber intentando instalar el asdf original que trae stumpwm mediante sbcl, en caso de dar error de compilacion en los pasos siguientes), en ese caso substituimos el script asdf.el que incluye nuestro paquete stumpwm por el asdf de la version de desarrollo, para ello primero renombramos el original:

      $ mv asdf.el asdf.el.old

      Y luego realizamos descarga de asdf (Another System Definition Format) en su version en desarrollo:

      $ git clone http://common-lisp.net/project/asdf/asdf.git

      Una vez hecho esto necesitamos instalar asdf, asi como otros scripts en nuestro sistema sbcl, para ello primero entramos en sbcl (Hacedlo desde el directorio stumpwm para no tener que jugar con rutas):
      $ sbcl
      Y luego realizamos la instalacion de asdf, clx y cl-ppcre (requeridos por stumpwm), notese que los «son parte del prompt de sbcl:
      : (require :asdf)
      : (require :asdf-install)
      : (asdf-install:install :clx)
      : (asdf-install:install :cl-ppcre)

      Ahora ya podemos lanzar el configure para compilar

      stumpwm usando sbcl:

      $ ./configure –with-lisp=sbcl

      Y Luego obviamente compilamos stumpwm (para ello se usara el compilador sbcl especificado anteriormente):

      $ make

      Para finalmente instalarlo en nuestro sistema:

      $ make install

      En caso de haber tenido exito, ya podemos modificar nuestro .xinitrc y anadir una linea tal que asi:

      $ exec stumpwm &

      Si todo ha ido bien, ya podremos disfrutar de nuestro flamante stumpwm, del cual explicare los keystrokes fundamentales para poder moverse con un minimo de soltura (todos ellos vendran precedidos por el prefijo C-t):

      C-t ! Evalua una expresion
      C-t e Lanza emacs
      C-t ? Lanza la Ayuda
      C-t : Muestra el prompt de Stumpwm
      C-t ; Muestra el prompt de CL
      C-t : quit Llama a la funcion quit de stumpwm
      C-t ; (ext:quit) Evalua la funcion quit de clisp (dependiendo de como se haya compilado puede funcionar o no existir)
      C-t ; (sb-ext:quit) Evalua la funcion quit de sbcl (dependiendo de como se haya compilado puede funcionar o no existir)
      C-t TAB Mueve el foco al siguiente frame
      C-t r <arriba/abajo/izq/der> Redimensiona un frame acortado por arriba/abajo/izq/der (requiere al menos 2 frames)

      C-t <arriba/abajo/izq/der> Mueve el foco arriba/abajo/izq/der.
      C-t t Iguala dimensiones de los frames
      C-t Desplaza el foco a un n-frame determinado
      C-t q Libera frames muertos
      C-t C-t Cambia a otro frame (switch)
      C-t M-<arriba/abajo/izq/der> Desplaza el frame a arriba/abajo/izq/der

      C-t s Divide la aplicacion de forma horizontal
      C-t S Divide la aplicacion de forma vertical
      C-t Q Hace que la aplicacion ocupe toda la pantalla (C-t r de resize solo permitira hasta cierto margen debido a que cada vez que se ejecuto C-t s o C-t S se creo un nuevo frame por eso es necesario usar C-t Q).

      Recordad que en emacs y elisp, un frame es lo que a lo en la actualidad nos referimos a ventana, y un a ventana es lo que en la actualidad nos referimos a frame, debido a razones historicas.

      Para un listado completo de todos los keybindings asi como el resto de componentes y como se manejan en stumpwm buscad en el manual oficial de stumpwm.

      Si quereis meter un fondo de pantalla al iniciar stump, podeis crear el fichero .stumpwmrc con el contenido:

      (set-bg-color «black»)

      O bien:

      (run-shell-command «xsetbg ~/fondos/fichero.png»)

      Con Xinerama activado para los dos monitores, en mi caso este es el resultado:

      stumpwm al iniciar (captura reducida, haced click para ampliar a 3360×1050)

      Free Image Hosting at www.ImageShack.us

      stumpwm mostrando la ayuda (captura reducida, haced click para ampliar a 3360×1050)

      Free Image Hosting at www.ImageShack.us

      Tambien si quereis experimentar eso que decia de ‘programar y evaluar vuestro codigo en tiempo real’ sin miedo de perder las X y por tanto vuestro trabajo, con dos monitores es posible, es decir en el primero lanzariais stumpwm y alli abririais vuestro emacs. Independientemente lanzais Xnest y un nuevo servidor en :1 que muestre en una pantalla del servidor en :0, desde emacs lanzais stumpwm y lo conectais a :1, asi tendriais en una pantalla emacs y en la otra el windowmanager. Ahora aqui en emacs podeis ir modificando y evaluando codigo de stumpwm y viendo en tiempo real dichos cambios.

      Por acabar una demo de stumpwm (aunque algo antigua [2007] pero de las pocas que he encontrado):

      Troubleshooting

      Solucion de algunos problemas que me han surgido con stumpwm:

      En latex-mode y AucTeX combinandolo con stumpwm surge un conflicto entre keybindings, ya que C-t C-t en stumpwm hace toggle entre frames mientras que C-c C-t C-p en latex-mode con AucTeX sirve para invocar pdfLatex para especificar si la salida sera dvi o pdf. La forma de solucionarlo es empleando el comando de stumpwm C-t t, el cual generara un C-t que nos servira para poder usar el comando C-c C-t C-p en cualquier otro WM, pero que en este se realizara mediante C-c C-t t C-p.


      « Página anteriorPágina siguiente »