Notxor tiene un blog

Defenestrando la vida


Agenda, fechas y configuración de teclas

Configurar modos de texto

Cuando trabajamos con textos largos es conveniente tener configuradas algunas cosas que nos facilitarán la vida. En general, los modos de texto y los modos de programación difieren en cómo muestran las líneas en el editor. Normalmente, en un modo de programación suele ser adecuado el mostrar una instrucción por línea; aunque ésta sea larga y supere por la derecha cualquier margen, al programador suele darle igual, pues no suele imprimir en papel el código: donde este hecho sería un inconveniente.

Sin embargo, para los modos de texto como pueden ser Markdown, org, LaTeX, etc. la convención suele ser agrupar líneas en párrafos, separándolos por líneas en blanco.

Hay varias variables que controlan el comportamiento de las líneas dentro de los ficheros. Una de las más importantes es fill-column, que por defecto está fijado en 70. Eso quiere decir, que cuando pulsemos M-q en una línea muy larga, nos formará un párrafo que sus líneas tendrán como máximo 70 caracteres. Esto es así, para permitir imprimir un texto plano en papel y que no se pierda contenido por el margen derecho de la hoja.

¿Ocurre algo por tener cada párrafo en una línea? Pues básicamente no, si no se va a imprimir el texto en papel. Aparte de una pequeña incomodidad si perdemos de vista contenido por el margen derecho de nuestro marco. Además podemos hacer que nos muestre el contenido en una sola línea o en varias con el comando toggle-truncate-lines. O incluso, hacer que según escribamos texto vaya saltando a la línea siguiente cuando alcance el valor fill-column, con el auto-fill-mode... Pero déjame que explique un par de cosas de cómo automatizar estas cosas desde nuestra configuración. Sólo un par:

  1. Configurar nuestros propios atajos de teclado.
  2. Añadir automatismos que cambien el comportamiento según el modo.

Configurar teclas propias

Lo primero que hay que recomendar es que mires detenidamente si el comportamiento que quieres automatizar tiene ya su propia combinación. Si es así te recomiendo que utilices la que ya tiene asignada. Eso minimizará la posibilidad de que utilices alguna combinación que ya tenga asignada alguna otra función... ¿te acuerdas cómo? Efectivamente, en C-h m podrás ver si la función que necesitas está en la lista.

Voy a poner un ejemplo: Imagina que nos gusta tener todo el párrafo en una sola línea, porque así nos facilita la carga del contenido en un script o porque es una manía nuestra. A veces necesitamos visualizar el contenido completo, pero se nos pierde por la derecha y a veces, necesitamos ver la estructura de líneas pero con toda la información se nos hace difícil. Por defecto, Emacs deja que se pierda el contenido a la derecha del marco, añadiendo una línea donde aparece un carácter , indicando que la línea continúa. Si queremos que nos muestre todo el texto podemos llamar al comando toggle-truncate-lines, que cambiará el modo en que se muestra el contenido y pondrá una ristra de caracteres en el margen derecho y otra de caracteres en el izquierdo para mostrar el flujo del contenido ajustado en el marco.

Bien, vale, eso es fácil pero ¿cómo puedes hacer que cambie desde una simple combinación de teclas? Muy sencillo, abre el fichero de configuración, como ya aprendiste en artículos anteriores y escribe la siguiente línea en él1:

(global-set-key (kbd "C-c t") 'toggle-truncate-lines)

Guarda el fichero con C-x C-s y recárgalo con M-x load-file <RET> ~/.emacs.d/init.el y ya podrás utilizar ese atajo de teclas en tu trabajo diario. ¿Difícil? Pues ahora voy a explicarte que lo que acabas de hacer es escribir una línea de código de elisp.

En elisp cada comando, función o instrucción2, llámalo como quieras, se encuentra rodeado por un par de caracteres (...). En realidad, estos caracteres conforman una lista y lo que hace LISP3 es procesar una lista cuando la encuentra. Así, la forma global-set-key lo que hace es asignar una combinación de teclas a una función particular. Como puedes ver la expresión (kbd "C-c t") es otra lista y la forma kbd lo que hace es convertir una cadena en formato estándar de combinaciones, como es C-c t en esa combinación de teclas que necesita global-set-key como primer parámetro o dato. Lo siguiente que necesita, en otro parámetro es la función que debe asignar a la tecla: toggle-truncate-lines. ¿Por qué tiene un carácter ' al principio? Pues para decirle a elisp que no evalúe dicha forma ahora, que tome sólo el nombre.

Añadir ganchos para comportamientos «automágicos»

Imagina que queremos editar un texto... eso si nuestra configuración por defecto del editor está pensada para programar, requerirá que perdamos un tiempo ajustando algunos parámetros que deberían cambiar para editar texto plano. Por ejemplo:

  1. Activar el ajuste de línea al valor auto-fill.
  2. Activar el diccionario para la corrección de palabras.
  3. Activar cualquier otra herramienta que te parezca útil.

Para estos casos, Emacs proporciona lo que se llaman ganchos o en inglés hooks. Cuando nuestro editor entra en un modo lo que hace es comprobar la lista de ganchos y ejecutar los que procedan. De esta manera, si definimos en nuestro fichero init.el los ganchos que nos van bien, el editor se configurará para responder de una determinada manera. Por ejemplo, añade estas dos líneas a tu fichero de configuración:

(add-hook 'text-mode-hook 'turn-on-auto-fill)
(add-hook 'text-mode-hook 'turn-on-flyspell)

La forma add-hook lo que hace es añadir un gancho a una lista de ganchos, en nuestro caso, podemos observar que la lista que modificamos es text-mode-hook en ambos casos. En la primera línea, el comando turn-on-auto-fill activa el salto de línea al alcanzar el ancho fijado en auto-fill y el comando turn-on-flyspell de la segunda línea, lo que hace es activar el corrector automático de palabras; es decir, mostrará los errores subrayando en rojo la primera aparición y en amarillo o naranja las siguientes.

Configurar el corrector ortográfico

Lo del corrector ortográfico mola, pero es posible que no te funcione a la primera, porque depende de herramientas externas y a lo mejor tienes que instalar algo. Emacs depende de herramientas externas para la corrección ortográfica. Tradicionalmente, el corrector es un programa que se llama ispell, pero si estás utilizando GNU/Linux es posible que lo tengas ya instalado, o quizá otros como aspell o hunspell. Si es este caso, tendrás que decirle a Emacs que utilice la herramienta correcta, poniendo el nombre del ejecutable en la variable ispell-program-name. Puedes hacerlo de modo gráfico, como expliqué en pasados artículos o añadiéndola a la lista en la forma custom-set-variables a mano.

Si tienes que instalar algún programa de estos, recuerda también instalar los diccionarios de las lenguas que utilices más habitualmente. Lo normal es que te instala el diccionario de inglés y el del idioma en el que esté configurado tu entorno, como por ejemplo español. Si necesitas más idiomas, recuerda instalar también los diccionarios que correspondan.

En mi caso, yo tengo en el apartado custom-set-variables una línea que especifica:

'(ispell-program-name "aspell")

Cuando necesites cambiar el diccionario puedes seleccionar el que quieras con el comando ispell-change-dictionary.

Después ya podrás utilizar la corrección de palabras. Si pinchas con el segundo botón del ratón sobre una palabra marcada como errónea te desplegará un menú para que selecciones entre varias opciones. O si ya estás metido en el modo texto, situándote en la palabra errónea y pulsando M-$ te mostrará un diálogo para que selecciones la alternativa correcta en un marco. Si pulsas C-. sobre un error, lo sustituirá por la primera de las opciones sin mostrarlas, también podemos pulsar sucesivamente C-. para recorrer varias opciones.

El calendario

Una de las herramientas que nos regala el org-mode es la agenda. Hay quien, como yo, la utiliza para organizarse el trabajo, las citas, el tiempo, las tareas, etc.

Vamos a empezar por el principio: el calendario. Pulsa la combinación de teclas C-c . para que aparezca el calendario de la siguiente forma:

   November 2019              December 2019               January 2020
Su Mo Tu We Th Fr Sa       Su Mo Tu We Th Fr Sa       Su Mo Tu We Th Fr Sa
                1  2        1  2  3  4  5  6  7                 1  2  3  4
 3  4  5  6  7  8  9        8  9 10 11 12 13 14        5  6  7  8  9 10 11
10 11 12 13 14 15 16       15 16 17 18 19 20 21       12 13 14 15 16 17 18
17 18 19 20 21 22 23       22 23 24 25 26 27 28       19 20 21 22 23 24 25
24 25 26 27 28 29 30       29 30 31                   26 27 28 29 30 31

Bueno, se empeña en mostrarnos el calendario en inglés. Lo mismo lo quieres personalizar y que te hable en tu idioma, para eso hay que configurar algunas cosillas además.

Formato de fechas

En mi caso me gusta organizar las fechas en formato ISO: año-mes-día. ¿Por qué? Pues porque me permite ordenarlas incluso aunque no sean fechas sino cadenas de texto. No me voy a liar en muchas explicaciones de los porqués, pero una vez te acostumbras al formato ISO, las fechas son claras. Eso está configurado en la variable calendar-date-style, donde puedes utilizar cualquiera de los tres formatos permitidos:

  1. ISO: año-mes-día
  2. european: día-mes-año
  3. american: mes-día-año

Puedes elegir el que más se ajuste a tus hábitos.

Nombres de los meses

Es posible también cambiar los nombres de los meses tal y como se muestran en el calendario. Para ello debemos modificar dos variables: calendar-month-name-array y calendar-month-abbrev-array. La primera guarda los nombres completos de los meses y la segunda las abreviaciones, algo que puedes haber supuesto dado el nombre de las mismas.

Si la modificación la haces desde el entorno gráfico con el menú Options -> Customize Emacs -> Specific Option... y dando el nombre de la variable, verás que se pueden modificar escribiendo los nombres al lado de su equivalente en inglés. Pero también puedes optar por modificar el fichero de inicio. Necesitarás añadir las siguientes dos entradas en el apartado custom-set-variables:

'(calendar-month-name-array
  ["enero" "febrero" "marzo" "abril" "mayo" "junio" "julio" "agosto" "septiembre" "octubre" "noviembre" "diciembre"])
'(calendar-month-abbrev-array
  ["Ene" "Feb" "Mar" "Abr" "May" "Jun" "Jul" "Ago" "Sep" "Oct" "Nov" "Dic"])

Como puedes apreciar, los nombres de los meses están escritos en orden dentro de un array delimitado por los caracteres [...]. Los he escrito en minúsculas como corresponde a la norma del castellano (pero siéntete libre de hacer lo que creas oportuno).

Nombres de los días de la semana y el orden

Además también necesitarás especificar los nombres de los días de la semana ajustándolos al idioma que quieras. Puedes optar por la versión gráfica de la configuración, en todo caso, yo muestro aquí cómo queda la cosa en el apartado custom-set-variables, como hemos visto en los meses:

'(calendar-day-name-array
  ["domingo" "lunes" "martes" "miércoles" "jueves" "viernes" "sábado"])
'(calendar-day-header-array ["Do" "Lu" "Ma" "Mi" "Ju" "Vi" "Sa"])

Tienes que observar que ambos arrays comienzan por el domingo y terminan en el sábado. Si estás acostumbrado a que tus semanas comiencen en lunes, necesitas establecer también la variable calendar-week-start-day a 1 (lunes). Por defecto, esa variable es 0, que corresponde al domingo.

La agenda

En realidad cualquier fichero org se puede mostrar como agenda, pero mi recomendación es que tengas uno especial donde guardar tus anotaciones. Si no tienes uno configurado, Emacs utilizará el fichero .notes para guardar tu agenda. Pero si eres un poco ordenado, seguramente te gustará guardarlo en algún otro sitio, con un nombre más descriptivo. Para eso debes ajustar la variable org-agenda-files4 en el apartado custom-set-variables o hacerlo en el modo gráfico, como ya sabes. En mi caso:

'(org-agenda-files (quote ("~/agenda/agenda.org")))

Lo tengo en un directorio que se llama agenda porque en él agrupo una serie de ficheros relacionados con la agenda, como el diario o el archivo. El diario guarda entradas sobre cumpleaños, días festivos del año, o encuentros periódicos. Su sintaxis es sencilla y seguramente lo veremos en otras entregas más adelante. Para activarlo necesitas tener el fichero org que guarde esa información en la variable org-agenda-diary-file y activar la variable org-agenda-include-diary. Al activar el diario, aparecerán festivos de los principales calendarios mundiales: cristiano, judío, musulmán, bahá, chino...

El fichero de archivo lo tienes que señalar en la variable org-archive-location. En el fichero señalado ahí guardará las entradas que queramos quitar de nuestro fichero de agenda al pulsar a en la ventana de agenda. Eso moverá la entrada desde el fichero agenda.org al fichero archivo.org anotando cuándo se hizo dicho traspaso. Quizá sea también materia para otra entrada sobre org-mode.

Quizá sea más interesante dejar por ahora la configuración de automatismos para ver la agenda y capturar datos. Pero como la captura es muy compleja, te recomiendo leer esta entrada del blog sobre una plantilla de captura algo compleja.

Conclusiones

De momento, vas viendo la versatilidad de nuestro editor: Todo se puede configurar y la forma de hacerlo es proveer código escrito en elisp, el lenguaje embebido en Emacs. Sin embargo, como puedes ver, el código no es complejo y es texto plano.

He intentado que veas más la posibilidades que profundizar en ellas. Si necesitas alguna de las opciones, seguramente conseguirás dominarlo a poco que leas la ayuda y trastees un poco. Sobre org te recomiendo que le eches un vistazo al manual que viene con él. Pero en español también puedes consultar la guía traducida.

Nota al pie de página:

1

Cuida que esté fuera de otras estructuras de listas. Para asegurarte que es así, puedes añadir ese texto en una línea en blanco al final del archivo.

2

En realidad no son sinónimos, pero tampoco voy a entrar a estas alturas en profundidades conceptuales sobre programación. Esto es sólo para que veas que no hay que tenerle miedo a programar y que hay cosas que de programación que están a tu alcance.

3

LISP significa procesador de listas.

4

Fíjate que dicha variable pide files en plural, lo que significa que se pueden tener varios ficheros para, por ejemplo, separar los distintos conceptos en diferentes archivos.


Comentarios

Debido a algunos ataques mailintencionados a través de la herramienta de comentarios, he decidido no proporcionar dicha opción en el Blog. Si alguien quiere comentar algo, me puede encontrar en Mastodon y en Diaspora con el nick de Notxor.

También se ha abierto un grupo en Telegram, para usuarios de esa red.

Disculpen las molestias.