Archivo de la etiqueta: emacs

Mi entorno de trabajo

Me han preguntado bastantes veces cómo me organizo y, aunque hace un tiempo hablé un poco sobre mi entorno de trabajo en Emacs, desde entonces he introducido algunas mejoras así que voy a hablar de mi entorno de trabajo en general. Aprovecho para enlazar otras entradas del blog en las que hablé en concreto de las herramientas que cito para que se note que las uso de verdad y no es (solo) postureo.

La base: acta en Org

La base de mi metodología es un archivo de Org que utilizo como acta y lista de tareas. Org tiene la ventaja de que me permite añadir imágenes, código y enlaces a diferentes documentos y, además, puedo exportar la parte del acta en diferentes formatos según las manías del receptor.

Este archivo se abre directamente cuando abro Emacs por las mañanas para que pueda ver qué me queda por hacer y acceder directamente a los documentos o al código en los que estoy trabajando desde él, que se abrirán o no en el propio Emacs según su formato. Para que esto ocurra he añadido la siguiente líneas a mi archivos de configuración:

; Abrir archivos con programa que corresponda
; Lo privativo!
(add-hook 'org-mode-hook
           '(lambda ()
          (add-to-list 'org-file-apps
               '("\\.m\\'" . default)    ;; Matlab
               '("\\.fig\\'" . default)  ;; Matlab
               '("\\.xlsx\\'" . default) ;; Excel
               )))

; Abrir acta al iniciar Emacs
(find-file (expand-file-name "acta/acta.org" default-directory))

Como toda mi labor investigadora se basa en este archivo tengo, evidentemente, una copia de seguridad.

El soporte auxiliar: diario de Emacs

Aparte de tener apuntadas mis tareas por temática, llevo un diario en el que apunto qué he hecho cada día. Esto tiene una doble función: por una parte, cuando me desmoralizo y creo que no avanzo, tengo evidencia empírica de que no es así; por otra, me sirve para seguir mi proceso mental y recordar qué estaba haciendo antes de irme de vacaciones, por ejemplo. Esto me resulta crucial porque me permite tanto desconectar en cuanto levanto el culo de la silla del trabajo como tener mis ideas hiladas en un lugar que no es mi (variable) cabeza.

Para ello uso el diario de Emacs de manera poco ortodoxa, que es como me gusta a mí usar las cosas. Tengo una copia de seguridad también del diario, claro.

El producto: texto plano y control de versiones

El tercer pilar de mi organización es que todo lo que produzco (los documentos, la bibliografía, las imágenes, el código …) es texto plano. Aparte de que de esta manera podré seguir accediendo a mi información dentro de treinta años1, así puedo tener todo bajo control de versiones. Para el control de versiones uso Magit en Emacs y git en la terminal por la vieja costumbre.

Os detallo un poco más cómo funciono:

  • Documentos: escribo en Org o en LaTeX tanto los artículos como los informes y las presentaciones para clase. Para LaTeX uso el modo AUCTeX con RefTeX para las referencias bibliográficas, CDLaTeX para las ecuaciones y Company para el autocompletado.

  • Bibliografía: la manejo con Jabref y, últimamente, con Helm-bibtex desde el propio Emacs. En este último caso, uso las variables locales para seleccionar el archivo de bibliografía correspondiente a cada documento así como la carpeta donde viven los pdfs.

%%% Local Variables:
%%% eval:(setq bibtex-completion-bibliography '("ruta_a_bib"))
%%% eval:(setq bibtex-completion-library-path '("ruta_a_pdf"))
%%% End:
  • Imágenes: trabajo generalmente con svg en Inkscape, o exporto a eps o svg desde el resto de programas. El motivo es que ambos son formatos vectoriales y eps el favorito de las revistas científicas. Para las gráficas científicas, tengo el código para producir la imagen bajo control de versiones y una función que le da un estilo uniforme a todas las imágenes que exporto.

  • Código: programo en Matlab por obligación y en Julia y últimamente algo en Python por vicio. Con Matlab hago más que suficiente con no caer en las malas prácticas que fomenta. Para programar en los otros dos uso los modos específicos de Emacs y también Org para programación literaria.

Un día en mi vida

Dicho esto, uno de mis días laborales suele tener esta estructura:

  1. Abro Emacs.
  2. Leo en la lista de tareas qué me queda por hacer y en el diario qué hice el día anterior.
  3. Decido qué voy a hacer. Si hay un archivo relacionado, estará enlazado en la propia lista de tareas y se me abrirá en Emacs o en el programa externo correspondiente.
  4. Trabajo. Escribo, programo, busco papers … abro ramas y envío actualizaciones al repo según corresponda con Magit o desde la terminal.
  5. Actualizo la lista de tareas y el diario con lo que vaya terminando y las conclusiones sacadas.
  6. Cierro Emacs.

Esta rutina laboral se irá modificando según vaya aprendiendo cosas nuevas, cuando eso ya os contaré. ¡De momento contadme vosotros qué hacéis!


  1. Dudo que vaya a querer, pero podré

Lo que he aprendido: manejar referencias bibliográficas en Emacs

Detesto instalar programas, aprender dónde están los botoncillos en un programa nuevo y que luego no me convenza y vuelta a empezar. Supongo que es uno de los motivos por los que me encanta Emacs: mismo programa, miles de tareas diferentes.

Últimamente he estado hurgando un poco en sus habilidades como gestor bibliográfico. Como ya os conté, yo suelo usar Jabref que es el programa que aprendí a usar en su momento y con el que me apaño bien para añadir referencias directamente desde la web, pero hay veces en las que manejar texto plano a pelo me parece más conveniente. ¡Y para eso no hay nada que iguale a Emacs! Os cuento un poco.

El modo BibTeX

La forma más básica para trabajar con bibliografías en Emacs es el modo BibTeX: se carga directamente al abrir un archivo con extensión .bib y nos permite organizar (M-x bibtex-sort-buffer) y adecentar (C-c C-c ) nuestras referencias.

Para insertar entradas tenemos el comando genérico C-c C-b tras el que podemos usar autocompletado, o el grupo de comandos que empiezan por C-c C-e. Por ejemplo, para crear una entrada de tipo artículo podemos hacer lo siguiente:

  • con C-c C-e C-a (o M-x bibtex-Article) creamos una plantilla para artículo;
  • rellenamos los datos necesarios, algunos comienzan por OPT porque son opcionales;
  • al acabar hacemos C-c C-c (o M-x bibtex-clean-entry) para quitar los campos opcionales que no hemos rellenado y que nos corrija el formato;
  • si no le hemos puesto una palabra clave nos sugerirá una y la entrada estará finiquitada y lista para ser citada.

Otro comando interesante es M-x bibtex-fill-entry (generalmente C-c C-q ) para alinear correctamente cada entrada bibliográfica. Y tampoco está mal establecer la variable bibtex-maintain-sorted-entries para tener las referencias en orden alfabético.

Como siempre, podemos recurrir a M-x describe-mode para que Emacs nos explique qué hace el modo. Es un modo chiquitico, pero muy útil para embellecer la lista de referencias ya que ayuda a cambiar de mayúsculas a minúsculas, quitar espacios innecesarios y míticas mierdas que, a las que somos maniáticas, nos ponen muy nerviosas.

Helm-bibtex

Mi modo favorito para gestionar las referencias bibliográficas en Emacs es Helm-bibtex. Lo descubrí intentando abrir los artículos que cito directamente desde Emacs y lo he introducido directamente en mi rutina de escritura científica (que algún día os contaré) junto con AUCTeX y RefTeX.

Es sencillito de usar: una vez instalado, lo llamamos con M-x helm-bibtex. Nos aparecerá entonces una lista de nuestras referencias bibliográficas en la que podremos elegir la entrada que queramos. Dándole a TAB vemos las acciones posibles, que se ejecutan todas en las teclas F1F12.

Como sugieren en su ayuda, he enlazado M-x helm-bibtex a la combinación Menú + b añadiendo esta línea al archivo de configuración:

(global-set-key (kbd "<apps> b") 'helm-bibtex)    

con la idea de configurar el resto de las historietas de Helm también en la tecla Menú y pulsar menos botoncicos.

Evidentemente, aunque sea muy listo este modo, tenemos que decirle dónde tenemos el archivo de bibliografía, los artículos en cuestión y las notas al respecto, si las estamos usando. Yo, como tengo un archivo y una carpeta con referencias para cada tema, establezco unas variables locales para el artículo que esté escribiendo

%%% Local Variables:
%%% eval:(setq bibtex-completion-bibliography '("refs.bib"))
%%% eval:(setq bibtex-completion-library-path  '("references/"))
%%% End:

pero si tuviera todas las referencias juntas, podría añadir ese par de líneas al archivo de configuración directamente con las rutas correspondientes.

ACTUALIZACIÓN (16/10/2019) Por algún motivo que desconozco (Windows), la ruta relativa dejó de funcionar de un día para otro y tuve que poner la ruta absoluta.

Una cosa que me encanta de este modo es que, por medio de RefTeX, localiza la bibliografía local si se usa helm-bibtex-with-local-bibliography en lugar de helm-bibtex. Algo bastante útil sobre todo cuando estamos manejando bibliografías de otras personas.

De esta manera, cuando estoy escribiendo un artículo y quiero citar algo o a alguien, abro mis referencias, busco entre ellas lo que necesito y abro directamente el archivo en el propio Emacs usando pdf-tools. En Windows (sorpresa) esto no me carrula, así que he añadido esto al archivo de configuración

(setq bibtex-completion-pdf-open-function
  (lambda (fpath)
    (call-process "acrobat" nil 0 nil fpath)))

para que me abra los pdfs con al Acrobat Reader. Si, por lo que sea, lo que busco no está entre mis referencias, el cacharro me busca en repositorios online. Me falta investigar cómo funcionan las notas, que hasta ahora no he tenido necesidad de ellas.

Sigue leyendo

Lo que he aprendido: Julia, Babel y Org

Ya sabéis que me gusta llevar la contraria. También que me gusta el minimalismo y usar el mínimo de herramientas posible. Así que cuando me ha dado por explorar la programación literaria y la investigación reproducible en Julia, en lugar de aprender a utilizar los cuadernos Jupyter como una persona normal, me he puesto a jugar con mi adorado modo Org y su funcionalidad para incluir bloques de código Babel1. Supongo que es lo que tiene ser la única de tu entorno (laboral) que hace estas cosas y no tener por tanto limitaciones en la elección de herramientas. Total, como en la academia no se colabora, no se va a dar el caso de que mi elección me limite. En fin, dejo la academia, que me caliento, y os explicito los motivos:

  • No instalo más software: ya estoy programando en Julia en Emacs así que no necesito mil programas y mi ordenador durará años y años.

  • Utilizo mis atajos de teclado y configuración: como sigo usando el mismo programa, no tengo que aprender dónde están otros botoncillos. Además, tengo definido cómo exportar a pdf desde Org pasando por LaTeX en mi archivo de configuración por lo que el documento final es exactamente como yo quiero.

  • Puedo cambiar de lenguaje de programación: el sistema funciona para una pila de lenguajes de programación. Puedo incluso mezclar código de diferentes lenguajes en un único documento2.

Visto esto, parece que elegir Org es una buena idea, así que paso a contaros en qué consiste la programación literaria, cómo se aplica en Org y qué tiene de especial el caso de Julia.

La idea: escribir para humanos

La idea de la programación literaria, como tantas otras buenas ideas, fue de Donald Knuth. Consiste en cambiar de lector objetivo al escribir un programa: en lugar de una secuencia de instrucciones para una máquina salpicada por algún comentario sobre la implementación, el programa se convierte en una descripción de la lógica detrás de la implementación salpicada por algún fragmento de código. De esta manera, no es necesario descifrar qué hace el programa leyendo el código porque las decisiones de diseño y la lógica se explicitan. Se puede pensar en el programa, entonces, como en una obra literaria.

Como me dedico a los métodos de cálculo, es decir, propongo una manera de calcular algo y luego demuestro mediante un ordenador que mi manera es mejor que la manera anterior, este enfoque me interesa por dos motivos:

  • Investigación reproducible: puedo escribir un artículo científico que incluya mis datos y mi código con lo que quien lo lea puede acompañarme en el proceso, obtener mis mismos resultados y verificar si que mis conclusiones son correctas.

  • Documentación útil: puedo explicar en el propio programa mi proceso mental para implementar numéricamente un cálculo que inicialmente era analítico, incluyendo matemáticas si es preciso.

Solo nos queda responder a una pregunta: ¿cómo demonios se lee esa mezcla de texto y código sin volverse una loca? Pues mediante los procesos de weaving, que deja solo lo humano, y tangling, que deja solo lo que entiende la máquina. ¡A ver si os habíais pensado que el señor Knuth no había pensado en esto! La cuestión aquí es que como tanto la documentación o explicación y el código salen de un mismo documento, ambos crecen juntos y limitamos la típica divergencia de según la documentación esta función tiene dos variables de entrada pero según el código tiene tres.

Programación literaria en Org

Ahora que sabemos qué es lo que queremos hacer, vamos a ver cómo lo hacemos en Org. No puede ser más fácil: cuando queramos meter un cacho de código escribimos

#+BEGIN_SRC lenguaje opciones_cabecera

Código

#+END_SRC

y ya está. Impresionante. Más os voy a decir: los bloques se pueden crear con las plantillas fáciles de Org situándonos en el principio de la línea y haciendo <s TAB.

Para poder ejecutar el trocito de código necesitamos primero decirle a Org que vamos a usar el lenguaje en cuestión y que ese lenguaje sea uno de los soportados. Tan sencillo como ir al archivo de configuración y añadir elementos a la lista de lenguajes:

(org-babel-do-load-languages
(quote org-babel-load-languages)
(quote (
(LENGUAJE1 . t)
(LENGUAJE2 . t)
)))

Ahora si hacemos C-c C-c sobre el trocito, lo ejecutaremos y nos saldrá el resultado debajo. Por seguridad, preguntará si queremos ejecutar y tendremos que contestarle, si somos vagos y nos gusta ver el mundo arder podemos decirle que ejecute todo el código sin preguntar con

(setq org-confirm-babel-evaluate nil)

¡Destrucción! ¡Sí!

Un detallico sobre los resultados: los trocitos de código se ejecutan por defecto como si fueran una función (opción de cabecera :results value) y solo nos devolverán el contenido si se lo pedimos explícitamente, con un return en el caso de Python, por ejemplo. Podemos cambiar la opción a :results output y, entonces, Org nos devolverá el contenido de STDOUT. Para lenguajes interpretados, podemos combinar esta opción con :session, que abre un intérprete y envía allí el código de todos los bloques que contengan dicha opción. Es un poco lío esto, pero jugando un poco con las opciones y leyendo la docu, se entiende.

También usamos las opciones de cabecera para decidir si al crear el documento exportamos el código (:exports code), los resultados (:exports results), el código y los resultados (:exports both) o nada (:exports none); para decirle a Org qué debe hacer con los resultados (:post); o para decir si queremos solo el archivo para la máquina (:tangle ARCHIVO_DESTINO), que por defecto no nos crea.

También podemos configurar cómo exporta el código al documento final. En mi caso, como el documento final es un pdf y eso pasa por LaTeX, quiero que use listingsUTF8 para los bloques de código. Se puede configurar para minted también, claro.

;; Exportar código como listings
(require 'ox-latex)
(setq org-latex-listings t)

;; Paquetes de LaTeX para código
(setq org-latex-default-packages-alist
'((""    "listingsutf8"  t)
("usenames,dvipsnames,svgnames,table"    "xcolor"    t))))

Las cuqueces y los colorinchis no se limitan al documento final, con

(setq org-src-fontify-natively t)

también tendremos colores en nuestro Org.

Ah, por cierto, el trocito de código lo podemos modificar en un buffer especial que se abre con C-c '.

El caso de Julia

Julia es uno de los lenguajes que no tiene soporte directamente en Babel porque su autor no le dio el copyright a la FSF. Por lo tanto, aparte de añadir Julia a la lista de lenguajes que puede usar Org, necesitamos los paquetes ESS y ob-julia.

Luego, hacen falta un par de líneas extra en el archivo de configuración para decirle a ob-julia dónde está el ejecutable de Julia (yo lo tengo en el PATH y por eso no le doy la ruta entera) y decirle a Emacs que use ob-julia:

;; Código Julia en Org
(setq inferior-julia-program-name "julia") ;; nombre o ruta de ejecutable
(require 'ob-julia)

(org-babel-do-load-languages
(quote org-babel-load-languages)
(quote (
(julia . t)
)))

Ale, ya puedo jugar a programar explicándome a mí misma lo que he hecho. Ahora solo me falta aplicar estas ideas al archivo de configuración de Emacs para no romperlo nunca.

Seguiremos informando.

Referencias

Documentación de Babel

Babel: active code in Org-mode

Working with source code en el manual de Org

Introduction to Literate Programming

Emacs para ciencias del dato

Julia with Emacs Org mode

Org-mode and julia: an introduction

Literate Programming Examples

Literate programming with Org-mode

Ten simple rules for writing and sharing computational analyses in Jupyter Notebooks

Drops of Jupyter notebooks: how to keep notes in the information age


Os dejo con música:


  1. También hay un paquete específico para Julia, pero ¿me gusta a mí lo fácil? No. 
  2. Lo digo como su supiese programar en múltiples lenguajes, ¿habéis visto? 

Lo que he aprendido: Julia en Emacs

He conseguido por fin poder programar en Julia usando Emacs. Eh, que no ha sido tan fácil: algo tan sencillo como instalar el julia-mode y el ess se convirtió en un infierno. Me pasó de todo.

Primero en GNU/Linux, como no estaba usando la versión más novedosa de elementary, el Emacs de los repositorios era demasiado antiguo y no compatible con los modos que me hacían falta. Me quedaban varias opciones: (i) actualizar el sistema (lo que finalmente hice); (ii) añadir un ppa con un Emacs más moderno (bien, pero prefiero tener los paquetes de mi distro que ya he organizado alguna petarda); o (iii) compilar Emacs desde fuente (ya lo hice alguna vez y no me apetecía repetir).

Luego en Windows, donde sí tenía un Emacs lo suficientemente moderno, parece ser que Julia tiene no sé que bug y se cuelga y hay que darle a C-g para que se reviva.

En fin, que actualicé el sistema operativo y en quince minutos ya tenía un entorno para programar en Julia. Bueno, eso en mi recién estrenado Juno, en Windows me conformo con Atom, ese editor que no es un editor. Qué dura es la vida a veces.

Después de contaros mis desventuras (para eso tengo un blog), paso a resumir qué hice la vez que funcionó todo.

Julia en GNU/Linux

Julia no está en los repos, nos dejan unos binarios genéricos para que descarguemos y ejecutemos sin más. Hay que elegir unos u otros según la arquitectura de nuestro procesador. Yo, como nunca sé qué tengo lo miro así:

ondiz@slimbook:~$ lscpu
Arquitectura:                        x86_64
modo(s) de operación de las CPUs:    32-bit, 64-bit

Descargados los binarios correspondientes, es útil crear un enlace simbólico a algún lugar donde ya estemos buscando ejecutables o añadir la carpeta donde los hemos descargado al PATH, a gusto del consumidor.

Yo he elegido la primera opción, así que he hecho:

sudo ln -s RUTA_A_EJECUTABLE /usr/local/bin/julia

Cuidadín que hay que poner la ruta absoluta al ejecutable bin/julia que si no no carrula.

Julia en Emacs

Pues lo que decía al principio: para tener un entorno chachi para programar en Julia solo hace falta instalar los modos julia-mode y ess. El primero es el modo oficial para editar Julia y el segundo es un paquete que ayuda a trabajar con lenguajes de programación para estadística (ESS viene de Emacs Speaks Statistics) como R, o en este caso, Julia. Se pueden hacer otras cosas, pero esta es la más simple en mi opinión.

Una vez instalados los modos, para activar una terminal juliana inferior solo hay que hacer M-x julia. Luego ya podemos abrir un archivo en la parte superior y jugar con opciones que nos da el modo ESS.

Llevo poco con el tema y solo he memorizado un par de combinaciones útiles (miento, no las he memorizado, las escribo aquí para mirarlas en el futuro):

  • C-c C-l: carga un archivo completo, lo que sería un include("archivo").

  • C-M-x: ejecuta (me encanta esta palabra) un trozo de código en el REPL.

  • C-c C-z: cambia del script al REPL o viceversa.

Hay también una pila de comandos para gestionar errores y para acceder a la documentación que algún día controlaré. O no. También me falta echarle un ojo a imenu anywhere para que me aparezcan opciones de autocompletado en cualquier lugar. Me lo dejo de deberes.

Curiosamente, lo que más trabajo me dio fue acostumbrarme a no darle a la flecha hacia arriba para repetir el último comando en el REPL. Aquí, como las combinaciones de GNU Readline están ya pilladas, hay que usar M-p y M-n (o C-↑ y C-↓) para moverse por la historia. Comint y cosas, ya sabéis, y si no, con hacer C-h b os enteráis.

Y hala, ya tengo un entorno para programar. Contadme qué usáis vosotros para que aprendamos todos, venga.

juliaEmacs

Referencias

Página oficial de Julia

Manual del modo ess

Julia en el modo ess

imenu anywhere en GitHub


Os dejo con un grupo cuyas canciones suelo berrear en los conciertos de las fiestas de los pueblos vecinos y que tiene el mérito de que no me quedase dormida encima del libro de física de primero de carrera. Era abrirlo y bostezar, oigan.

Lo que he aprendido: el buffer de paquetes de Emacs

Años usando Emacs y no ha sido hasta hace unos meses que he descubierto que el buffer de los paquetes, ese al que entramos con M-x list-packages es mucho más fácil de usar de lo que yo pensaba.

Resulta que si te posicionas en la línea de un paquete sin instalar y le das a la i lo marcas para instalar, si vas a uno instalado y le das a la d lo marca para eliminar (delete) y si le das a la U así en general, marca los paquetes que hay que actualizar con una I (upgrade). ¿Y ahora cómo hacemos efectivas estas órdenes? Pues dándole a la x. Así todo lo que queramos borrar se borrará, lo que queramos instalar se instalará y lo que queramos actualizar se actualizará.

En la imagen se ve la I mágica de la que hablo en la columna de la izquierda del todo.

paquetes

En fin, aquí lo dejo, por si hay otro genio como yo por ahí al que le resulta útil. A cuidarse.

Referencias

48.1 The Package Menu Buffer en el manual de Emacs


Solo del punk no se vive, hoy suenan trompetas.

Lo que he aprendido: AUCTeX

Me he hartado de usar más de un programa y he decidido que las pocas veces que escriba en LaTeX a pelo lo haré también en Emacs. Así soy, cada día más simple. Para ello estoy usando AUCTeX, un modo hiperpotente que tiene una manual de solo 130 páginas y que se autodefine como un sofisticado entorno TeX para Emacs.

Lo curioso del tema es que instalé AUCTeX hace más de un año porque fue la única manera de hacer funcionar CDLaTeX, el modo menor que ayuda a crear entornos y movidas matemáticas y que uso con Org. En todo este año no he configurado AUCTeX y he seguido usando Texmaker y Kile por pura inercia. Ahora que lo he puesto a mi gusto y que llevo usándolo una semana, he desinstalado el resto de editores de LaTeX y no creo que vuelva atrás, ¡me encanta!

Unas órdenes básicas

Como siempre, para usar AUCTeX hay que instalarlo y activarlo, a mí se me activa solo al abrir un archivo con extensión .tex, pero si no fuera el caso, M-x LaTeX-mode y adelante. Cuidado con confundirlo con latex-mode, el modo para LaTeX que viene con Emacs. Sí, lo hacemos aposta para liar.

Usar AUCTeX es bastante sencillo, hay un par de atajos de teclado que valen para casi todo y que os listo aquí. La palabreja que pongo en cursiva es con lo que yo relaciono la combinación de teclas para acordarme (que puede o no ser la  idea del autor original).

  • C-c C-c (compile) ejecuta una orden, dando a TAB podemos ver las opciones, hay opciones molonas como Clean all y Clean que eliminan respectivamente todo lo creado por la compilación y solo los archivos auxiliares.
  • C-c C-v (view) muestra el resultado.
  • C-c C-e (environment) introduce un entorno y te va pidiendo los datos que necesite.
  • Si tenemos el activado el parser automático, con C-c C-a (all) deduce qué tiene que usar y compila las veces que haga falta. No viene activado por defecto porque tarda un poco. Esta historieta nos fabrica una carpeta `auto` con cosas dentro, no os asustéis como hice yo. En el archivo de configuración que he puesto más abajo podéis ver cómo se activa.

Como hereje del Emacs que soy os voy a decir algo: no hace falta aprenderse todo esto. Utilizad la GUI y los menús desplegables sin pudor alguno (yo lo hago, un botón tiene un leoncito muy cuqui).

Sigue leyendo

Lo que he aprendido: fuente de Emacs

¡He aprendido a cambiar la fuente de Emacs! Y no solo eso, sino que he conseguido que sea diferente según el sistema operativo en el que nos encontremos.

Todo esto ha venido porque la fuente por defecto de Emacs en Windows no me diferenciaba los ceros y la letra O y los unos y la L minúscula y me estaba volviendo loca. Aprovechando que en Matlab me había pasado a Consolas, decidí que de ahora en adelante usaría Consolas al estar en Windows (es una fuente propietaria pero que viene incluida en Microsoft Office). En GNU/Linux he seguido con la que se establecía por defecto1, Roboto Mono, que aunque la creó Google, lleva licencia Apache.

Como yo quería que Emacs eligiera la fuente según el sistema operativo, necesitaba averiguar primero cómo le llamaba Emacs a mi sistema operativo. Esto puede conseguirse evaluando la variable system-type, o bien con M-x eval-expression o con M-:. Así supe que esta variable toma el valor de windows-nt en Windows y gnu/linux en GNU/Linux. Algo totalmente inesperado dicho sea de paso.

Bien, ahora me faltaba averiguar cómo cambiar la fuente y crear un if. Lo primero es simple, solo hay que añadir cualquiera de estas líneas al archivo de configuración:

;; Establecer fuente
(set-face-attribute 'default t :font FUENTE :height TAMAÑO)
;; Establecer familia de fuentes
(set-face-attribute 'default t :family FAMILIA :height TAMAÑO)

El if tampoco es mucho más complejo, solo hay que tener en cuenta que tiene miles de paréntesis:

(if (condición)
(Expresiones si se cumple la condición)
(Expresiones si no se cumple la condición))

Fusionando ambas cosas me quedó esto:

;; Fuente
(if (eq system-type 'windows-nt)
    (set-face-attribute 'default nil :family "Consolas" :height 110)
    (set-face-attribute 'default nil :family "Roboto Mono" :height 110)
)

Evidentemente se puede mejorar añadiendo una condición de que use la fuente correspondiente solo si está disponible o de otras manera diversas que ahora no se me ocurren pero a vosotros sí porque sois muy listos. La cuestión es que hurgando un poco se puede conseguir casi cualquier cosa en Emacs y por eso me encanta.

Ale pues, os dejo, ¡contadme cosas en los comentarios!

Referencias

How to determine the operating system in elips? en StackOverflow

Emacs: Font Setup en Ergo Emacs

38.3 Operating System Environment en el manual de Emacs

37.12.1 Face Attributes en el manual de Emacs


Sonando:


  1. Para ver qué fuente está usando Emacs podemos hacer M-x describe-font 

Lo que he aprendido: magit

He empezado a usar Magit. Tanto escuchar Magit es el mejor modo para git jamás creado y yo empecé a usar Emacs por Magit me han convencido a darle una oportunidad. Eso y que el modo git normal que usaba no me carrula bien en el ordenador del curro (¡Windows!).

La cuestión es que Magit me flipa, puedo manejar mi repo desde Emacs solo dando a un par de teclas y ayudando por tanto a mis pobres bracitos lesionados por el ordenador.

Lo más curioso de este modo es que funciona a base de ventanitas (pop ups) en las que se nos dan opciones diversas. A cada ventanita se accede con una tecla y podemos acceder a la ventanita de las ventanitas con h (help). Cada ventanita se divide en dos pedazos, en la parte superior activamos las opciones y en la inferior elegimos el comando. No os preocupéis que enseguida lo veremos todo mucho más claro.

Por cierto, si como yo usáis Emacs con GUI y menús (¡sacrilegio!) tendréis en la barrita un menú de Magit con las diferentes órdenes y sus teclas correspondientes.

Lo básico: status, add y commit

Empezamos a usar Magit en un repositorio existente diciéndole que nos muestre el estado del mismo en una de sus ventanitas con la siguiente orden:

M-x magit-status RET
magitStatus

La ventanita de estado

Sigue leyendo

Lo que he aprendido: el ratón y org mode

Como ya os he dicho más veces uso Emacs de una manera un tanto curiosa, con su GUI y hasta con el ratón porque al final me muevo en un entorno gráfico y me encaja mejor así con el resto de herramientas (sí, uso cosas que no son Emacs). Parece ser que yo no soy la única, ya que hay modos de Emacs que añaden funcionalidades molonas al ratón y entre ellos mi favorito es org-mouse.el, que como su nombre indica se usa en mi amado modo Org.

Sirve para lo siguiente:

  • Nos muestra un menú contextual al hacer click derecho en diferentes elementos
  • Permite abrir y cerrar árboles con un click izquierdo
  • Marca casillas de las listas de tareas al hacer click izquierdo sobre ellas

Parece poca cosa pero hacen de Emacs un lugar más amigable para los novatillos, los desmemoriados o los vagos, tres categorías a las que pertenezco.

Para activarlo solo hace falta añadir una línea al archivo de configuración:

;; Cargar org-mouse
(require 'org-mouse)

Podéis ver este modo en acción en este screencast1:

Referencias

How to setup org-mouse to intuitively toggle checkboxes on org-mode? en StackExchange

5.6 Checkboxes en el manual de Org


Os dejo con una canción que he localizado por casualidad:

Lo que he aprendido: ecuaciones rápidas con CDLaTeX

Ando últimamente bastante liadilla y agradezco cualquier herramienta que me facilite la vida. Una que me hace muy feliz es el modo menor de Emacs CDLaTeX, que acabo de descubrir y se ha convertido en imprescindible en mi día a día. En concreto lo uso en combinación con el modo Org, que trae su propia variante org-cdlatex. Paso a hablaros sobre ello.

El modo CDLaTeX

Tal y como dice en su README, CDLaTeX es un modo menor para la inserción rápida de entornos y movidas matemáticas en LaTeX:

CDLaTeX is a minor mode for Emacs supporting fast insertion of environment templates and math stuff in LaTeX

Lo escribió el mismo señor que el modo Org, Carsten Dominik, y se puede encontrar tanto en MELPA como en Github. Requiere texmathp.el que dicen que es parte de Emacs a partir de la versión 21.3, pero yo tuve que instalar AucTeX (que también lo contiene) para hacerlo funcionar.

Ecuaciones rápidas

La idea de este modo es evitarnos el tedio de escribir desde cero las ecuaciones de LaTeX y los símbolos matemáticos. Es muy listo y sabe cuándo estamos dentro de un bloque matemático (entre \begin{equation} y \end{equation}) y cuándo no, y así activa y desactiva funcionalidades según el contexto. Por ejemplo, al escribir un guión bajo nos añade automáticamente las llaves para que escribamos dentro el subíndice.

La tecla principal de este modo es el TAB, que hace de todo:

  • Predice comandos: si lo pulsamos después de haber escrito una parte de un comando nos lo completa. Me encanta porque equ + TAB inserta directamente un entorno de ecuaciones, ¡así de fácil! Podemos ver todas abreviaturas con M-x cdlatex-command-help.

  • Reduce subíndices y superíndices simples: nos escribe automáticamente las llaves para los subíndices y superíndices pero podemos eliminarlas para los casos de una sola letra pulsando el TAB delante de la llave de cierre.

  • Mueve el cursor a la siguiente unidad de interés: podemos avanzar por las ecuaciones con el TAB alegremente.

No solo del TAB se vive, también tenemos otras funcionalidades chulas:

  • Entornos rápidos C-c { nos mete entornos como align dentro del bloque de ecuaciones.

  • El apóstrofe modifica el carácter anterior, añadiendo un punto encima u otras movidas locas matemáticas. Si lo pulsamos y esperamos un poco nos aparece un cuadro con todas las opciones disponibles.

  • El acento grave introduce comandos, por ejemplo a</kbd> escribe\alphatanto dentro como fuera del entorno matemático, <kbd>b escribe \beta y así sucesivamente. Varios acentos cambian de nivel, tomando el caso de la letra l como ejemplo, precedida de un acento escribe \lambda, con dos acentos \ell, y con tres \log. Lo que es utilísimo para los que escribimos mucha mate. ¡Un truco! Para escribir letras griegas mayúsculas, tras introducir una con el acento grave y la letra, podemos usar M-b para movernos al inicio de la palabra y M-c para que Emacs nos la ponga en mayúsculas. Es fantástico. Al igual que el apóstrofe, si esperamos un poco después de pulsarlos nos aparece un cuadro con las opciones.

Lo único que me queda por contaros es que si este modo os conquista como a mí, podéis activarlo siempre con Org añadiendo esta línea al archivo de configuración:

;; Activar CDLaTeX con Org mode
(add-hook 'org-mode-hook 'turn-on-org-cdlatex)

¡Y hala! ¡Productividad a tope! 😀

¿Vosotras qué modos y herramientas usáis para simplificar vuestro trabajo? Ilustradme, porfis.

Referencias

org-cdlatex en el manual de Org

CDLaTeX en GitHub


Últimamente estoy dejando salir a mi celta interior: