Onda Hostil: Lo que he aprendido: expresiones regulares en Emacs

Hablé hace tiempo de las expresiones regulares por aquí (de hecho fue lo que inauguró la sección Lo que he aprendido) pero todavía no me había puesto a usarlas en serio en Emacs para buscar y reemplazar cosas. Algún día tiene que ser el día, así que voy a ver si puedo resumir aquí para futura referencia la sintaxis de las expresiones regulares de Emacs, cómo se usan para buscar y qué ventajas nos ofrecen a la hora de reemplazar texto.

Sintaxis

La sintaxis de las expresiones regulares de Emacs tiene muchas cosas en común con las de otros programas y lenguajes de programación pero también tiene sus peculiaridades. Con C-h S regexp podemos ver toda la información sobre las regexp de Emacs, como soy muy maja os resumo aquí algunas cosas:

  • Los símbolos ., +, *, ? y [] funcionan de la manera típica:
    • . sustituye a cualquier carácter excepto al de nueva línea. Por ejemplo, a.b pillará cualquier secuencia de tres caracteres que empiece por a y acabe con b.
    • * localiza el carácter precedente cualquier número de veces, incluido cero. Por ejemplo, ca* captará caaaa pero también c.
    • + lo mismo que el anterior pero obligando a que el carácter precedente aparezca como mínimo una vez. Al contrario que ca*, ca+ no captará c. Para no confundirlo con el anterior a este le llamo el uno o más.
    • ? similar a * pero solo capta el carácter precedente una vez o cero. Siguiendo con el ejemplo, ca? captará c y ca? pero no caaa. Yo a este le llamo el si hay sí.
    • [] indica opciones. Por ejemplo, [ac]a encontrará las cadenas aa y ca. Su contrario es [^] que elimina las opciones entre corchetes, de este modo, [^ac]a encontrará ba pero no ca.
  • En Emacs hay clases sintácticas que empiezan por \s y su negación por \S. Por ejemplo, \sw indica un carácter de palabra (letras en minúscula o mayúscula y dígitos) y \s. un carácter de puntuación. A diferencia de otros programas, Emacs no interpreta \s como un espacio, para eso está \s-.

  • También tenemos clases sintácticas que se usan entre corchetes (adicionales a los que ya llevan) como [:digit:] para los números y [:alnum:] para los caracteres alfanuméricos. Una cosa a tener en cuenta es que estas clases varían según el modo.

  • Hay marcadores de borde, por ejemplo, \b indica el borde de palabra, y ^ y $ el inicio y el fin de línea respectivamente.

  • Podemos capturar grupos con \(CAPTURA\) para después hacer referencia a ellos con \N, donde N es un número que indica su posición. Por ejemplo, si hacemos \([[:digit:]]+\) capturaremos en la variable \1 una tira de números seguidos.

Para jugar con estas historias tenemos el modo interactivo re-builder en el que podemos escribir y modificar expresiones regulares y ver qué texto capturan. Para llamarlo hacemos:

M-x re-builder

¡Al loro! Este modo por defecto nos obliga a escapar doblemente las expresiones por lo que \b\sw+ se convierte en \\b\\sw+ y se convierte en una brasa brutal de escribir. Podemos cambiar este comportamiento en el archivo de configuración usando el estilo string en lugar que el read que usa por defecto:

(setq reb-re-syntax 'string)

Así las expresiones regulares de este modo serán como las que usamos en el resto de situaciones.

Buscar

Ahora que sabemos escribir expresiones regulares, veamos cómo nos ayudan en la vida. Lo más simple que podemos hacer es buscar cosas. Para ello tenemos por ejemplo el regexp I-search, que es como el I-search pero usando expresiones regulares. Es fácil recordar su combinación de teclas, es como la del I-search pero añadiendo M:

C-M-s

Al igual que el I-search normal, este nos marca en el texto todas los trocitos que cumplan nuestra regexp y volviendo a pulsar C-M-s vamos navegando entre ellas.

Reemplazar

Aquí es cuando las cosas se ponen interesantes. Gracias a esta herramienta podemos extraer información y reorganizarla como nos parezca. Simplemente usamos el modo Regexp Replace y la magia de las expresiones regulares:

M-x replace-regexp RET expresión regular RET sustitución

Os cuento un caso concreto. Estaba escribiendo un estado del arte en Markdown pero estaba teniendo problemas con los filtros de Pandoc así que como solución momentánea había optado por escribir las referencias bibliográficas con estilo LaTeX, pasar de Markdown a LaTeX y compilar a pdf después. Estas referencias consisten en el comando \cite{} al que se le da como argumento la clave de la publicación en la base de datos. Como sigo la convención autor-año para las claves, tienen esta pinta:

\cite{autor2017}

Una vez solucionado el problema con el filtro, decidí pasar las referencias a sintaxis de Markdown para que todo fuera coherente, en este caso debería ser [@autor2017]. Necesitaba por lo tanto capturar las claves de las publicaciones y sustituir el comando \cite{} por [@]. Hice lo siguiente:

M-x replace-regexp RET \\cite{\(\sw+\)} RET [@\1]

Donde el \1 se refiere al grupo capturado \sw+, que en este caso son las claves de las publicaciones, y se me modificaron todas las referencias como yo quería. ¡Fantástico! Problema resuelto con una única línea. ¡Cómo se gana en eficiencia con un editor decente! 😀

regexp hamlet t-shirt
Foto de Prehensile Eye Licencia CC-BY-NC-SA

Referencias

15.6 Syntax of Regular Expressions en el manual de Emacs

15.10.2 Regexp Replacement en el manual de Emacs

RegularExpression en Emacs Wiki

Emacs: how to replace a string using a regular expression? en StackOverflow

Emacs: Regex Tutorial en ErgoEmacs

Comparing regular expressions in Perl, Python, and Emacs


-1:-- Lo que he aprendido: expresiones regulares en Emacs (Post Ondiz)--L0--C0--October 21, 2017 08:15 PM

Maxxcan's Site: Qué es spacemacs

la web de spacemacs
1 Introducción Mi idea era seguir haciendo artículos básicos sobre Emacs, pero viendo que ya hay …
-1:-- Qué es spacemacs (Post admin)--L0--C0--October 17, 2017 03:52 PM

nba - GNU's Rock: Emacs, configuracion de verano

todo empezo una tarde calida cuando cambie de distro a manjaro, abri el emacs para ponerme a programar “el morg” (que esta en go) y aparecia un mensaje de error muuu largo, informando que el flycheck (un modo para verificar el codigo mientras se va escribiendo) no localizaba la ruta al ejecutable del flycheck-go. Como no encontraba el origen del problema y queria tunear el emacs, me propuse abandonar el sistema que tenia para agregar extensiones al emacs, el cual consistia basicamente en buscar un paquete, clonar el repositorio del codigo y probar hasta se cargara a lo bestia sin tirar del sistema de paquetes del que dispone emacs… je, como decir que no me gustan las cosas automagicas que hacen las cosas sin que me entere, pero bueno, siendo emacs me dare el lujo de ser un poco mas permisivo
-1:-- Emacs, configuracion de verano (Post )--L0--C0--September 29, 2017 12:47 AM

Onda Hostil: Lo que he aprendido: ver pdfs en Emacs

¡Hola! Últimamente no escribo tan a menudo porque el capitalismo me ha vuelto a atrapar en sus redes. Que he empezado a currelar, vaya. Y entre la mudanza, el nuevo trabajo, que salí despedida de un buseto y demás cosas locas que pueblan mi vida no doy para más.

Lo que os vengo a contar hoy es algo que he descubierto haciendo una presentación sobre mí misma que me han pedido en el trabajo. Aprovechando que tenía mi ordenador la he escrito en Markdown en Emacs y luego la he convertido en un pdf con Pandoc. Mi típico proceso del que he hablado en cantidad de ocasiones. Como llamo a Pandoc desde la terminal en Emacs (un día lo integraré) me ha venido la cosa de abrir también el pdf final en Emacs ¡y no salir de Emacs nunca jamás! JUAJUAJUA. Bueno, me centro.

El modo DocView

La cuestión es que Emacs ya es capaz de ver pdfs (es megalisto), gracias al modo DocView, que permite abrir documentos DVIs, PostScript, OpenDocument y hasta de Microsoft Office. Para ello los convierte en imágenes que carga y muestra.

Que no está mal, pero es cutrecillo y a mí me iba mal por algún motivo, se veía borroso y no podía navegar por el pdf. Si jugáis con él un ratillo me podéis poner qué tal, igual es más que suficiente para muchos casos.

PDF Tools

Me decidí por tanto a instalarme un modo específico más potente que DocView y me encontré con PDF tools, un cacharro que dice ser un reemplazo de DocView. PDF Tools se basa a su vez en Poppler, una librería para renderizar pdfs.

Se puede instalar desde MELPA (M-x package-install RET pdf-tools) pero requiere ser compilado la primera vez que se vaya a usarse. Es majete y si hacemos M-x pdf-tools-install intenta configurarse a sí mismo. A mí me funcionó perfectamente, supongo que porque ya tenía instaladas las herramientas de cuando compilé Emacs, tenéis más información sobre dependencias y tal en el README.

Me gusta mucho PDF tools, permite seleccionar y copiar texto, buscar, crear anotaciones y moverse por las referencias y enlaces. No tiene nada que envidiarle a muchos lectores de pdf.

Nada más por hoy, tengo que seguir investigando porque se puede usar en conjunto con LaTeX y sincronizar la entrada y la salida. Es muy emocionante. Os dejo con una imagen de cómo se ve:

pdftools


-1:-- Lo que he aprendido: ver pdfs en Emacs (Post Ondiz)--L0--C0--September 21, 2017 05:30 PM

Onda Hostil: Lo que he aprendido: selección rectangular en Emacs

La selección rectangular es una de las cosas por las que amo Emacs, una vez que la pruebas ya no puedes vivir sin ella. ¿En que consiste esa cosa tan espectacular? me diréis. Veámoslo con un ejemplo: imaginemos que tenemos esta tabla en un archivo de texto plano:

A    24
B    24
C    45
D    78
E    13

De repente nos damos cuenta de que hemos metido dos veces el dato para A y que tenemos todos los números una fila más abajo de lo que corresponde. Argh. Sería guay poder seleccionar los datos correspondientes a la columna y situarlos en la posición correcta, ¿no? ¡Pues con Emacs podemos gracias a la selección rectangular!

La selección rectangular

Para definir el rectángulo en cuestión usamos la marca y el punto, la marca será la esquina superior izquierda y el punto la esquina inferior derecha. Para establecer la posición de la marca usamos como siempre C-ESPACIO, el punto es la posición actual del cursor. Emacs seleccionará las filas y columnas que estén en el dentro de la sección rectangular que hemos definido.

Una vez elegido el rectángulo podemos hacer diferentes cosas con él, lo más habitual será quitarlo de un lado para ponerlo en otro, para ello tenemos:

  • M-x kill-rectangle (C-x r k) para cortar (kill) el rectángulo texto
  • M-x yank-rectangle (C-x r y) para pegar (yank) el rectángulo de texto

La combinación de teclas para todas las funciones que afectan en un rectángulo empiezan por C-x r para que sean más fáciles de recordar. Las demás las tenéis en el manual, por si no me creéis.

Todo esto es muy chulo pero tiene para mí un problema: Emacs no nos marca de ninguna manera especial el rectángulo que estamos seleccionando. Como siempre, hay una solución para esto.

El modo de selección rectangular

A partir de Emacs 24.4 hay una variante de la selección rectangular: el modo Rectangle Mark. Lo activamos con M-x rectangle-mark-mode o C-x ESPACIO y nos muestra qué trozo de texto está seleccionando. Nos permite además usar las combinaciones de teclas de siempre para cortar y pegar. Aquí lo tenéis en acción:

rectangle

Por cierto, si usáis el modo CUA porque no queréis memorizar las combinaciones de teclas de copiar, cortar y pegar de Emacs podéis activar la selección rectangular con C-ENTER. Su selección de rectángulos mola bastante

Nada más por hoy, espero haberos hecho llegar algo de mi amor por Emacs, esta funcionalidad es muy útil para los que trabajamos con datos, con Markdown…

Referencias

12.5 Rectangles en el manual de Emacs

Emacs: Edit Column Text, Rectangle Commands en Ergo Emacs

Working with rectangular selections

A Peek at Emacs 24.4: Rectangular Selection


-1:-- Lo que he aprendido: selección rectangular en Emacs (Post Ondiz)--L0--C0--August 29, 2017 09:47 PM

Onda Hostil: Lo que he aprendido: compilar Emacs desde fuente

¡Saludos damas y caballeros! Vuelvo después de mis merecidas vacaciones con el frikismo recargado. Digo esto porque estuve de visita en casa de un amigo que compiló Emacs 25 desde fuente delante de mí y ha provocado que tenga envidia y quiera compilar yo también. Y eso os vengo a contar, mi experiencia creando Emacs desde sus piezas más elementales desde mi punto de vista de ignorante de la informática.

¿Compilar?

No es mi primera vez compilando, es concretamente la segunda. La primera fue con pdfpc que compilé tanto en Windows como en GNU/Linux invocando a cmake para que crease las instrucciones, luego a make para que compilase y finalmente a make install para que me instalase el programa en las carpetas correctas.

Compilar Emacs es similar solo que en lugar de llamar a cmake usamos el script configure, un script estándar para los programas de GNU que verifica que el sistema cumple las condiciones para compilar el programa en cuestión y crea las instrucciones para make.

Que los programas de GNU se compilen siempre de la misma manera es debido al conjunto de herramientas GNU Build System o Autotools, que ayudan a crear paquetes de código portables para que los programadores se centren en la funcionalidad de sus programas y que los usuarios solo tengan que aprender el método para compilar una única vez.

He resumido lo que he entendido de este proceso en un dibujillo, para que luego sepamos más o menos dónde estamos:

¡A compilar Emacs!

Después de esta pequeña introducción vamos a ensuciarnos las manoplas. Los pasos que seguiremos son:

  1. Descargaremos el código fuente
  2. Si hemos clonado de un repo ejecutaremos autogen.sh para obtener el script configure
  3. Ejecutaremos configure con las opciones que queramos
  4. Llamaremos a make que nos fabricará Emacs
  5. Si queremos instalar Emacs en las carpetas de instalación haremos make install

Veamos cuál ha sido mi experiencia con sus problemas y soluciones.

Descargar el código fuente

Evidentemente, lo primero que necesitamos para compilar desde fuente es el código fuente. Para conseguirlo tenemos dos opciones:

  • Descargar la release desde la web a mano, con wget o como nos parezca. En este caso empezamos directamente con el script configure, siguiendo las instrucciones del archivo INSTALL.

  • Clonar desde el repositorio de GitHub o Savannah. Obedeceremos a INSTALL.REPO que nos manda ejecutar autogen.sh para que aparezca el famoso configure.

El script autogen.sh

Como yo siempre sigo el camino más difícil, cloné el repo de GitHub y por lo tanto tuve que invocar primero a autogen.sh. Para ello necesité primero instalar Autoconf, una de las herramientas que conforman el GNU Build System y que se encarga de crear el script configure a partir del archivo configure.ac. Como suele ser habitual, hice:

sudo apt-get install autoconf

En el caso de que descarguemos la release no tenemos que fabricar el script configure sino que ya viene incluido.

El script configure

Ahora nos toca ejecutar configure para que nos verifique si tenemos todas las librerías necesarias instaladas y genere finalmente el Makefile si es así. También podemos pasarle diferentes opciones para controlar el proceso, con --help vemos cuáles hay.

Por ejemplo, yo utilicé --prefix para elegir el destino en el que quería que se instalase Emacs. No quería que lo instalase en el directorio por defecto /usr/local/ porque solo estaba haciendo unas pruebas:

ondiz@slimbook:~/Testing/emacs$ ./configure --prefix=/home/ondiz/Testing/

Nos irá diciendo qué dependencias tenemos que resolver y la opciones que debemos darle si no queremos usarlas con un mensaje de este estilo:

configure: error: The following required libraries were not found:
libXpm libjpeg libgif/libungif libtiff gnutls
Maybe some development libraries/packages are missing?
If you don't want to link with them give
--with-xpm=no --with-jpeg=no --with-gif=no --with-tiff=no --with-gnutls=no
as options to configure

Para resolver el problema buscamos los paquetes correspondientes y los instalamos. Por ejemplo, para la primera de ellas haríamos:

ondiz@slimbook:~/Testing/emacs$ apt-cache search libXpm 
libxpm-dev - X11 pixmap library (development headers)
libxpm4 - X11 pixmap library
libxpm4-dbg - X11 pixmap library (debug package)
xpmutils - Utilidades de mapas de píxeles para X11
jwm - very small lightweight pure X11 window manager with tray and menus

Como nos pide las librerías de desarrollo elegimos el primer paquete, libxpm-dev. Haciendo lo mismo para el resto de librerías, vemos que para este caso concreto necesitamos instalar los siguientes paquetes si queremos tener soporte para imágenes de diferentes tipos en Emacs:

sudo apt-get install libxpm-dev libjpeg-dev libgif-dev libtiff-dev gnutls-dev

Cuando tengamos las librerías preparadas volvemos a ejecutar el script y vemos si nos salta algún otro error.

En mi caso, aparte de las librerías de imágenes también necesité las de Gtk+ (libgtk-3-dev) para tener GUI. También se puede compilar sin GUI (--with-x=no) o con otra librería de X windows.

Lo último que me dijo fue que POP3 es inseguro y que lo desactivase y que instalase GNU Mailutils para gestionar el email1, cosas que hice para ver qué pasaba. Mi línea final para ejecutar configure fue por tanto:

./configure --prefix=/home/ondiz/Testing/ --without-pop

Como veis no es difícil, solo hay que ir siguiendo las instrucciones que nos da. Cuando tengamos todo como debe estar nos dirá que ya podemos continuar con la compilación.

Por cierto, después de pasar un rato resolviendo errores, descubrí que el truco del almendruco es instalar las dependencias de una versión anterior, por ejemplo, nosotros que estamos compilando Emacs 25, ya que Emacs 24 está en los repositorios, haríamos:

sudo apt-get build-dep emacs24

¡Pero para ello hay que tener las fuentes en sources.list! Si os ocurrirá lo mismo que a mí:

ondiz@slimbook:~/Testing/emacs$ sudo apt-get build-dep emacs24
Leyendo lista de paquetes... Hecho
E: No se pudo encontrar el paquete de fuentes para emacs24

Invocar a make

Ahora que ya tenemos todas las dependencias resueltas y el Makefile generado nos toca llamar a make que nos generará el ejecutable en la carpeta src. Podemos usarlo desde ahí o instalarlo en las carpetas de instalación con make install. Con esto quiero decir que se instalará con la típica estructura con el ejecutable en PREFIX/bin, diferentes movidas en PREFIX/share/emacs/VERSION, etc. donde PREFIX es la ruta que le hemos pasado anteriormente a configure o, por defecto, /usr/local/.

Por último, podemos borrar las sobras generadas en la compilación con make clean o directamente todas las fuentes si no queremos compilarlo de nuevo. Si queremos compilarlo otra vez con diferente configuración, en cambio, necesitamos hacer make distclean.

¡Y ya está! Ya podemos usar nuestro recién generado Emacs. Aquí lo de siempre, si no tenemos la carpeta donde vive Emacs en el PATH tendremos que proporcionar toda la ruta o podemos crear un lanzador o lo que nos apetezca. ¡Los que uséis elementaryOS como yo recordad el bug! Habrá que llamar a Emacs con algo parecido a esto:

XLIB_SKIP_ARGB_VISUALS=1 emacs

Ale pues, hermanos, hemos acabado por hoy. Le mando desde aquí un beso al señor que me mostró el proceso y le dedico la canción del final, ¡he aprendido mucho compilando Emacs! 😘

Referencias

7.1 How do I install Emacs? en el manual de Emacs

How to Build Emacs on Linux en Ergo Emacs

Script compile-emacs.sh en GitHub

GNU Build System en la Wikipedia

The GNU configure and build system

configure; make; make install en TLDP

Emacs 25.1 released

What’s New in Emacs 25.1 en Mastering Emacs

E.2 Running Configure and Make en el manual de Octave

Compiling Linux Software from Source Code


  1. Y me salió una ventana raruna para configurar el email y tardé como 15 minutos en descubrir que para seleccionar los botones de Aceptar y Cancelar tenía que darle a las flechas. 

-1:-- Lo que he aprendido: compilar Emacs desde fuente (Post Ondiz)--L0--C0--August 27, 2017 04:21 PM

nba - GNU's Rock: Run Scheme

En el anterior post (cronologico del blog) comente algunos interpretes de Scheme. Ya que en Emacs tenemos un interprete de elisp nativo, supuse que habria un metodo sencillo, para correr Scheme, pero, por que correr todo un interprete cuando se puede echar mano del interprete del sistema de turno y powerizarlo con el incomparable Emacs, o si, hasta Gulie que en terminal era insipido, se vuelve Sexi! Todos los interpretes adquieren historial, hasta los que no lo tenian!
-1:-- Run Scheme (Post )--L0--C0--August 20, 2017 11:42 PM

nba - GNU's Rock: Por que GNU Emacs?

Si el tiempo antes de precindir de interfaces para interactuar con los computadores se extiende lo suficiente, Emacs, terminara por ser un sistema operativo autosuficiente coloca una pista de sonido, relajate y disfruta de este post al estilo “lo que otros IDEs no quieren que sepas”, “la increible historia de emacs, no podras creer el final”, “Emacs el editor que no esperabas”, … 〜( ̄△ ̄〜) he, pero es que yo utilizo (vim|VS|atom|eclipse|nano|…) y no necesito un editor viejuno y raro!
-1:-- Por que GNU Emacs? (Post )--L0--C0--July 02, 2017 05:26 PM

Maxxcan's Site: Programación literaria para Devops con Emacs (1 parte)

programación literaria
  Aquí os dejo mi conferencia sobre Programación Literaria para Devops. Posteriormente subiré el material empleado      
-1:-- Programación literaria para Devops con Emacs (1 parte) (Post admin)--L0--C0--June 13, 2017 10:17 AM

Bad Daemons: Ansible en emacs

Ultimamente he estado toqueteando bastante Ansible. Para quien no lo conozca, Ansible es un gestor de configuraciones. Permite instalar y configurar programas y configuraciones en un ordenador o en 1.000. Por eso se usa en el ámbito de la Integración Contínua. Pero bueno, ya hablaré más en profundidad de ello en otro articulo.

Por ahora hablaré de lo que uso para editar playbooks. Uso yaml-mode, ansible-doc y ansible-vault-mode. Por suerte los playbooks de Ansible se escriben en el maravilloso formato Yaml, muy cómodo para editarlo. El modo no ofrece mucho más que la indentación y los colores, pero tampoco hace falta mucho más:

(use-package yaml-mode
  :ensure t)

ansible-doc lo que hace es ofrecer el comando de línea ansible-doc pero desde emacs, con helm o ivy si se usa alguno. La primera linea de la sección config enlaza el ansible-doc-mode al yaml-mode, por lo que cuando se edite yaml, solo hay que ejecutar C-? y se accederá a los docs. Por defecto la primera vez que se lo llama tarda bastante en responder, por que guarda la respuesta para que las siguientes veces sea más rápido. Yo lo que he hecho es añadir la segunda línea, que hace que este cacheo se produzca al iniciar emacs. Tarda más en arrancar semacs, pero dado que solo lo arranco una vez cada muchas semanas, no me resulta un problema.

(use-package ansible-doc
  :ensure t
  :config
  (add-hook 'yaml-mode-hook '(lambda () (ansible-doc-mode)))
  (progn
    (save-window-excursion (ansible-doc "a10_server"))
    (kill-buffer "*ansible-doc a10_server*")))

Y por último, ansible-vault. Este paquete es otro wrapper de su equivalente de terminal. Para quién no lo sepa, vault es la forma de gestionar variables sensibles en ansible. Se puede usar de dos formas, con una contraseña genérica o una por proyecto. Para lo primero, solo hay que crear un fichero ~/.vaut_pass. Para lo segundo, hay que hacer uso del fichero .dir-locals.el. Este fichero permite concretar variables por directorio, como su nombre indica. Es algo propio de emacs, no de ansible-vault. Por lo tanto, en ese fichero habria que poner algo como esto:

((yaml-mode
  (ansible-vault-pass-file . "~/.ansible-vault/custom_vault_pass")))

La configuración del modo en si es la siguiente:

(use-package ansible-vault
  :ensure t
  :config
  (defun ansible-vault-mode-maybe ()
    (when (ansible-vault--is-vault-file)
      (ansible-vault-mode 1)))
  (add-hook 'yaml-mode-hook 'ansible-vault-mode-maybe))

Con esto, se hace mucho más facil y cómodo editar playbooks de Ansible. Y si además queremos visitar la página de la documentación oficial, siempre se puede usar counsel-dash.

-1:-- Ansible en emacs (Post drymer)--L0--C0--June 06, 2017 06:16 PM

Quijote Libre: Aprendiendo GNU Emacs y org-mode (VIII)

“Capturar” en org-mode Una de las principales facilidades que me he encontrado en GNU Emacs, y en particular en org-mode, es la sencillez de almacenar la información en texto plano. Así que para intentar quitarme el mono y recuperar ritmo … Sigue leyendo
-1:-- Aprendiendo GNU Emacs y org-mode (VIII) (Post Quijote Libre)--L0--C0--June 03, 2017 12:24 PM

Bad Daemons: Ejecución asíncrona de bloques babel en org-mode

En el articulo sobre la programación literaria para sysadmins se pudo ver que los bloques de babel en org-mode son muy útiles. Lo malo que tiene ejecutar estos bloques es que se bloquea emacs. El dichoso tema de la concurrencia de nueva. Pero como siempre, se puede trampear.

Se puede abrir un proceso paralelo de emacs para que ejecute el bloque sin que bloquee el proceso de emacs principal. Me estaba pegando con ello justo cuando descubrí que alguien ya lo habia hecho mejor. Veamos un ejemplo. Primero un ejemplo síncrono, que no tiene mucho sentido pero es gratis:

no-async-babel.gif

async-babel.gif

Muy fácil de usar, como se puede ver. Lo único malo que tiene es que no se puede usar la variable :session, por lo tanto se pierde la idempotencia. Se puede usar :noweb, pero cada bloque ejecutará todo lo anterior, lógicamente. Pero bueno, no me suele afectar demasiado para lo que uso. Para instalar el paquete que habilita este parámetro hay que añadir esto al archivo de configuración de emacs:

(add-to-list 'el-get-sources '(:name ob-async
                                     :type github
                                     :pkgname "astahlman/ob-async"))

(if (not (el-get-package-installed-p 'ob-async))
    (el-get 'sync 'ob-async))

(use-package ob-async
  :load-path "el-get/ob-async/"
  :config
  (add-to-list 'org-ctrl-c-ctrl-c-hook 'ob-async-org-babel-execute-src-block))

Una vez instalado y configurado, se puede usar como cualquier otro parámetro de bloque. Se puede establecer en el propio bloque, como se puede ver en el segundo gif, o se puede establecer como una propiedad en un árbol.

-1:-- Ejecución asíncrona de bloques babel en org-mode (Post drymer)--L0--C0--May 28, 2017 09:23 AM

Bad Daemons: Que tecla iba ahora?

Cuando empiezas a usar un modo de emacs lo más habitual es intentar aprender los atajos. Siempre es algo complicado, al menos para mi, que tengo la memoria de un pez. Lo que hacia hasta ahora era mantener la página del proyecto abierta en el navegador o apuntarme los binds. O simplemente presionar M-x, escribir la función que quiero ejecutar, ver que atajo de teclado tiene asignado (ivy te lo muestra) y presionarlo por eso de la memoria muscular. Pero hace poco descubrí which-key.

Lo que hace es mostrar los posibles atajos de teclado cuando se ha apretado el inicio de una combinación. Por ejemplo, si presiono C-c me mostrará todas las combinaciones que empiecen por C-c. Se verá más claro en esta imagen.

which-key.png

Y la configuración es muy simple:

(use-package which-key
  :ensure t
  :config
  (which-key-mode))
-1:-- Que tecla iba ahora? (Post drymer)--L0--C0--May 22, 2017 06:48 PM

Quijote Libre: Aprendiendo GNU Emacs y org-mode (VII)

“Tareas” en org-mode Todo sistema de productividad tiene una función, que no es otra que ayudarnos a “hacer” aquellas cosas que tenemos, queremos y podemos hacer, a las que generalmente llamamos “Tareas”. Ya hemos visto que esta denominación es excesivamente … Sigue leyendo
-1:-- Aprendiendo GNU Emacs y org-mode (VII) (Post Quijote Libre)--L0--C0--May 01, 2017 10:09 AM

Bad Daemons: Abrir un fichero con sudo automáticamente en emacs

Es una de estas cosas que a primera vista parece que deba ser algo simple, pero es algo más complejo cuando empiezas a mirarlo. Ya hace tiempo que encontré una función para hacerlo en local en la fantástica web de emacsredux:

(defun sudo-edit (&optional arg)
  "Edit currently visited file as root.

With a prefix ARG prompt for a file to visit.
Will also prompt for a file to visit if current
buffer is not visiting a file."
  (interactive "P")
  (if (or arg (not buffer-file-name))
      (find-file (concat "/sudo:root@localhost:"
                         (ido-read-file-name "Find file(as root): ")))
    (find-alternate-file (concat "/sudo:root@localhost:" buffer-file-name))))

El funcionamiento es: abrir un fichero y luego ejecutar M-x sudo-edit RET. No es la fiesta, pero funciona bien. El problema es que yo suelo editar muchos ficheros en remoto y por desgracia esta función no funciona, ya que tiene hardcodeado el hostname localhost. Intentando arreglar esto, me fijé en que el sitio del que habia sacado esta función tenia una segunda opción que deseché simplemente por que no la entendia:

(defadvice find-file (after find-file-sudo activate)
  "Find file as root if necessary."
  (unless (and buffer-file-name
               (file-writable-p buffer-file-name))
    (find-alternate-file (concat "/sudo:root@localhost:" buffer-file-name))))

Ahora que ya entiendo un poco más de emacs lisp, se que defadvice sirve para añadir la ejecución de una función o macro antes de otra, una suerte de before-hook. Y en este caso, esta función hace que find-file intente abrir el fichero con sudo si detecta que no tiene permisos para modificarlo. Es posible que esto diése problemas si se tiene la costumbre de modificar los atributos de los ficheros, pero es muy poco habitual.

Como eso no me servia para editar ficheros en máquinas remotas, he modificado la función anterior para que detecte automáticamente si se intenta abrir un fichero en la máquina local o en una remota y si es lo segundo, que modifique la ruta para que pueda hacerlo:

(defadvice purpose-find-file-overload (after find-file-sudo activate)
  "Find file as root if necessary."
  (unless (and buffer-file-name
               (file-writable-p buffer-file-name))

    (let* ((buffer-file (buffer-file-name))
           (coincidence (string-match-p "@" buffer-file))
           (hostname)
           (buffer-name))
      (if coincidence
          (progn
            (setq hostname (substring buffer-file (+ coincidence 1)
                                      (string-match-p ":" buffer-file      (+ coincidence 1))))
            (setq buffer-name
                  (concat
                   (substring buffer-file 0 coincidence) "@"
                   (replace-regexp-in-string ":" (concat "|sudo:" hostname ":")
                                             buffer-file nil nil nil (+ coincidence 1))))
            (find-alternate-file buffer-name))
          (find-alternate-file (concat "/sudo:root@localhost:" buffer-file))))))

En mi caso se modifica la función purpose-find-file-overload, que es la que tengo asignada a C-x C-f, pero se puede cambiar por ido-find-file, find-file o la que sea.

La ruta correcta para abrir un fichero remoto con permiso de superusuario seria así: /ssh:drymer@daemons.it|sudo:root@daemons.it:/. Esto último lo he sacado de este post de Stack Overflow.

-1:-- Abrir un fichero con sudo automáticamente en emacs (Post drymer)--L0--C0--April 25, 2017 04:00 PM

Quijote Libre: Aprendiendo GNU Emacs y org-mode (VI)

“Etiquetas temporales” en org-mode En el manual de org-mode apartado 8 se hace referencia a un concepto especial de etiquetado que llama “timestamp” termino que traduciré por “Etiqueta temporal” ya que tiene un tratamiento muy similar al que se usa … Sigue leyendo
-1:-- Aprendiendo GNU Emacs y org-mode (VI) (Post Quijote Libre)--L0--C0--April 22, 2017 09:49 AM

Bad Daemons: Sprunge.el - Enviar texto a un paste

Hace ya un par de años cuando quiero compartir texto desde la terminal, ya sea código o un fichero de configuración, uso https://sprunge.us. Tengo un alias hecho:

alias paste="torify curl -F '\''sprunge=<-'\'' http://sprunge.us"

Esto se añade al ~/.bashrc o al ~/.zshrc, se ejecuta algo como cat ~/.bashrc | paste y ale, a volar. Y evidenetemente, se puede hacer lo mismo en emacs con el paquete equivalente, sprunge.el. Provee dos funciones, sprunge-buffer y sprunge-region, para enviar el buffer o la región selecionada a sprunge, respectivamente. Se instala y configura tal que así:

(add-to-list 'el-get-sources '(:name sprunge
                                     :type github
                                     :pkgname "tomjakubowski/sprunge.el"))

(if (not (el-get-package-installed-p 'sprunge))
    (el-get 'sync 'sprunge))

(use-package sprunge
  :init
  (use-package request :ensure t)
  :load-path "el-get/sprunge")

No tiene mucho misterio, solo tiene la dependencia de request, que está incluido en la sección de :init.

-1:-- Sprunge.el - Enviar texto a un paste (Post drymer)--L0--C0--April 19, 2017 02:16 AM

Quijote Libre: Aprendiendo GNU Emacs y org-mode (V)

Lo cierto es que la vuelta al trabajo esta siendo dura y mis últimos años laborales se presentan díficiles lo que me esta dejando el ánimo por los suelos, pero aún así sigo intentando avanzar y hoy os voy a … Sigue leyendo
-1:-- Aprendiendo GNU Emacs y org-mode (V) (Post Quijote Libre)--L0--C0--March 26, 2017 12:00 PM

Quijote Libre: Recursos de Org y Emacs

Irreal es uno de los sitios que siempre me aporta información interesante sobre Emacs y en uno de su últimas entradas ha hecho referencia a Ben Elijah de Ink and Ben que ha publicado una página con una muy interesante … Sigue leyendo
-1:-- Recursos de Org y Emacs (Post Quijote Libre)--L0--C0--March 12, 2017 08:26 AM

La Pipa Plena: Curso emacs 23. Presentaciones con beamer

En esta entrada veremos como crear una presentación con beamer a partir de un archivo org. Para no andar dejando archivos esparcidos por cualquier parte, creamos un directorio de trabajo y en su interior colocamos el archivo presentacion.org: $ mkdir beamer $ touch beamer/presentacion.org Para hacer lo mismo también puedes emplear dired: M-x d RET
-1:-- Curso emacs 23. Presentaciones con beamer (Post templix)--L0--C0--March 05, 2017 04:37 PM

La Pipa Plena: Curso emacs 22. Personalizar la linea de modo y el minibuffer

En esta entrada veremos como personalizar un poco la linea de modo y el minibuffer. Sin ningún tipo de modificación, la linea de modo puede lucir más o menos así: Añadiendo a nuestro archivo de configuración .emacs las siguientes lineas: (setq-default mode-line-format (list " %2 " mode-line-modified " %2 %f %4 [%l:%p] " " %4
-1:-- Curso emacs 22. Personalizar la linea de modo y el minibuffer (Post templix)--L0--C0--February 24, 2017 03:42 PM

Onda Hostil: Lo que he aprendido: variables locales en Emacs

Pasando a limpio mis apuntes de italiano, me he puesto a investigar cómo establecer el idioma para la revisión ortográfica de un documento porque me da mucha rabia tener que cambiarlo cada vez que lo abro. Gracias a estas pesquisas he descubierto algo interesante: las variables locales de Emacs.

Con variable local me refiero a una variable que solo afecta a un documento. Es decir, marcamos el documento de tal manera que le diga a Emacs cómo lo tiene que tratar. Estas variables pueden indicar el modo en el que Emacs debe abrir el documento, el idioma del corrector, la anchura de texto, …

Hay dos maneras de incluir variables locales. Podemos añadir una línea al principio del documento dentro del comentario correcto para nuestro tipo de archivo (que Emacs nos pone muy amablemente con M-;).

La línea en cuestión tiene esta pinta (habría que comentarla con la marca de comentario que corresponda):

-*- variable1: valor ; variable2:valor -*-

En mi caso, la variable a establecer es ispell-local-dictionary. Como estaba escribiendo en Markdown, la línea quedó así:

<!-- -*- ispell-local-dictionary: "italian"; -*- -->

La otra opción es hacer una lista de variables locales al final del documento. La lista tiene esta pinta:

Local Variables:
variable1: valor
End:

Al igual que antes, debemos comentar estas líneas como corresponda, por ejemplo, si estuviese escribiendo en LaTeX lista para el idioma del corrector quedaría así:

% Local Variables:
% ispell-local-dictionary: "italian"
% End:

Nada más, hoy entrada corta para compensar el tocho de ayer 😉

Referencias

How to set spelling dictionary on the fly in Aquamacs

51.2.4.1 Specifying File Variables en el manual de Emacs

Local variables en EmacsWiki

Go Gnu por Uosɐɾ Mcarthur vía Attribution Engine. Licencia CC BY.

-1:-- Lo que he aprendido: variables locales en Emacs (Post Ondiz)--L0--C0--February 22, 2017 06:41 PM

La Pipa Plena: Curso emacs 21. Postámbulos y algo sobre imágenes en org-mode

Por defecto, el postámbulo que aparece en un html que ha sido exportado de un archivo org, coge los datos del sistema y consta del nombre del autor (author), la fecha (timestamp), las versiones de emacs y org-mode (creator) y el link de validación del código. Si queremos especificar más datos de las mencionados o
-1:-- Curso emacs 21. Postámbulos y algo sobre imágenes en org-mode (Post templix)--L0--C0--February 18, 2017 06:22 PM

nba - GNU's Rock: no mas tabs en go-mode

Go tiene una ridicula guia de estilo para formatear codigo que no me agrada, de no seguir algunas reglas el compilador/interprete simplemente se niega a hacer nada. Otras reglas, son menos rigurosas, como la indentacion o colocar o no espacios, en algunos sitios. La indentacion oficial del lenguaje, tiene tabs equivalentes a 4 espacios en blanco y eso, eso, es algo que no puedo soportar, como tampoco tener tabs, porque cada editor los despliega como le viene en gana.
-1:-- no mas tabs en go-mode (Post )--L0--C0--February 13, 2017 03:52 AM

La Pipa Plena: Curso emacs 20. Gráficos con org-mode (ditaa y plantuml)

En esta entrega veremos como crear gráficos con org-mode para que al exportar a html se vean aparentes. En primer lugar, caso de no tenerla instalada, instalamos la aplicación ditaa (apt-get install ditaa), aplicación que transforma caracteres ascii en mapas de bips. Una vez instalado en el sistema, abrimos emacs y visualizamos su página man:
-1:-- Curso emacs 20. Gráficos con org-mode (ditaa y plantuml) (Post templix)--L0--C0--February 05, 2017 03:07 PM

nba - GNU's Rock: org mode

org-mode es un lenguaje de marcas ligeras nacido de, por, y para emacs y como emacs, org tambien tiene aplicaciones varias, puede ser una agenda, una lista de pendientes, hoja de calculo, blog de notas, sistema de documentacion e investigacion reproducible, todo junto y revuelto, encima da la posibilidad de exportar el contenido a pdf, latex, html, markdown, odt y groff (algunas opciones vienen por separado y requieren configuracion).
-1:-- org mode (Post )--L0--C0--January 31, 2017 08:40 PM

Maxxcan's Site: Qué hacer después de instalar Emacs (3ª parte)

Qué hacer después de instalar Emacs (3ª parte) Seguimos con la última parte de nuestra introducción a …
-1:-- Qué hacer después de instalar Emacs (3ª parte) (Post admin)--L0--C0--January 24, 2017 01:35 PM

La Pipa Plena: Curso emacs 19. impatient-mode, writeroom-mode, capturas y memoria en uso.

En esta ocasión veremos algunos paquetes interesantes que, en determinadas circunstancias, pueden sernos útiles. En ciertas ocasiones queremos compartir un buffer de emacs en nuestra red local y que además todos vean lo que estamos tecleando en tiempo real. Una forma fácil de realizar estas proezas es con la extensión impatient-mode. Este paquete precisa simple-httpd
-1:-- Curso emacs 19. impatient-mode, writeroom-mode, capturas y memoria en uso. (Post templix)--L0--C0--November 28, 2016 06:00 PM

Maxxcan's Site: Qué hacer después de instalar Emacs (2ª Parte)

Si no has visto la 1ª Parte la tienes aquí 1 Algunos paquetes interesantes 1.1 Ido mode Ido Mode …
-1:-- Qué hacer después de instalar Emacs (2ª Parte) (Post admin)--L0--C0--July 19, 2016 03:20 PM

Maxxcan's Site: Qué hacer después de instalar Emacs (1ª Parte)

  1 Introducción Si acabamos de instalar Emacs por primera vez y hemos visto los artículos anteriores …
-1:-- Qué hacer después de instalar Emacs (1ª Parte) (Post admin)--L0--C0--July 13, 2016 09:29 PM