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:
- Configurar nuestros propios atajos de teclado.
- 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
LISP
3 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:
- Activar el ajuste de línea al valor
auto-fill
. - Activar el diccionario para la corrección de palabras.
- 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:
- ISO: año-mes-día
- european: día-mes-año
- 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-files
4 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.
Footnotes:
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.
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.
LISP
significa procesador de listas.
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