Cuaderno de GNUtas

Enlaces personalizados en Org (I). Un enlace para gestionar fuentes

Uno de los pilares en que se asienta la gran capacidad «sináptica» de Org Mode es sin duda su robusto, potente y versátil sistema de enlaces. Ya sólo con lo que nos viene de fábrica podemos trabajar con un muy amplio repertorio de enlaces: a direcciónes de internet, para redactar un correo a un destinatario determinado, para acceder a páginas «Info» del sistema, a directorios, a documentos, a imágenes, etc. Cada una de estas variopintas funcionalidades se suele lograr mediante el añadido de una etiqueta determinada antes de la ruta del enlace. Por ejemplo, si queremos crear un enlace para escribir un correo electrónico, debemos anteponer a la ruta la etiqueta mail-to:, tal que así:

[[mailto:dirección-de-correo][nombre que se muestra]]

Aquí trataremos sobre cómo crear etiquetas personalizadas, a fin de que, al activar el enlace, se ejecute determinada acción sobre la ruta.

El método «antiguo»

En las versiones de Org anteriores a la 9 esto se conseguía mediante una función típica como la que mostraré a continuación. Imaginemos que queremos crear un tipo de enlace especial para saltar a los marcadores; es decir, que si añadimos la etiqueta (un suponer) boomark: seguida de la ruta, que debe ser un marcador, se sos conduzca directamente hasta allí. Entonces, nuestra función se parecería a ésta:

(require 'bookmark)

(org-add-link-type
 "bookmark" (lambda (bookmark)
              "Evalúa `bookmark-jump' com BOOKMARK como argumento."
              (bookmark-maybe-load-default-file)
              (bookmark-jump bookmark)))

El método «nuevo» con org-link-set-parameters

El método descrito en el anterior apartado, si bien era efectivo, resultaba también un tanto limitante. Gracias a org-link-set-parameters podemos especificar de forma simple y transparente una serie de parámetros para nuestro nuevo tipo de enlace. En el caso que nos ocupaba de los marcadores, queremos que nuestro enlace tenga, además, un color distinto del resto de enlaces estándar de Org. Así podemos saber que nos conducirá a un marcador. Lo indicamos mediante el parámetro :face. Por otro lado, el parámetro :follow es también autoexplicativo: será siempre una función cuyo argumento sea siempre la ruta del enlace. En este caso tiramos de una función anónima:

(org-link-set-parameters
 "bookmark"
 :follow (lambda (ruta) (bookmark-maybe-load-default-file) (bookmark-jump ruta))
 :face '(:foreground "green4" :underline t))

Un caso práctico más elaborado: enlaces para gestionar fuentes

Como hemos visto, el método nuevo da mucho juego y el límite está —como suelen decir los eslóganes cursis— en nuestra imaginación. Sin ir más lejos, comentaré aquí un caso práctico que me resulta bastante útil.

En mi trabajo de composición tipográfica me encuentro a menudo con la necesidad de gestionar gran cantidad de fuentes: fuentes del sistema, fuentes que tengo guardadas en carpetas, fuentes nuevas que necesito probar, etc. Cuando estoy preparando la composición de un libro (o me hallo inmerso en ella) tomo muchas notas en documentos de Org Mode, y eso incluye apuntes sobre fuentes y enlaces hacia ellas. Entonces, ¿por qué no crear un nuevo tipo de enlace que ejecute no una, sino un pequeño menú de acciones sobre la ruta de la fuente? Serían, concretamente, estas tres acciones:

  • Abrir la fuente enlazada con fontforge
  • Desplegar una información rápida de la fuente con el comando otfinfo
  • Mostrar una lista con las propiedades OpenType de la fuente, de nuevo gracias a otfinfo

Empezaremos, pues, por definir un menú con estas tres acciones, mediante una función que tome como argumento la ruta de la fuente:

(defun acciones-org-link-fuente (fuente)
  "Ofrece una lista de tres opciones sobre la ruta de la fuente"
  (interactive)
  (let
      ((lista-acciones-sobre-fuente '((?1 "Abrir con fontforge" (lambda ()
                                                                  (async-shell-command (format "fontforge %s" fuente))))
                                      (?2 "información (con otfinfo)" (lambda ()
                                                                        (async-shell-command (format "otfinfo -i %s" fuente))))
                                      (?3 "listar las propiedades otf (con otfinfo)" (lambda ()
                                                                                       (async-shell-command (format "otfinfo -f %s" fuente)))))))
    (let ((accion (read-char-choice (concat "Acciones sobre la fuente >>\n"
                                            (mapconcat (lambda (item)
                                                         (format "%c: %s" (car item) (nth 1 item))) lista-acciones-sobre-fuente " -- "))
                                    (mapcar #'car lista-acciones-sobre-fuente))))
      (funcall (nth 2 (assoc accion lista-acciones-sobre-fuente))))))

Ésa sería la función que añadiríamos al parámetro :follow de nuestro nuevo enlace. Pero hay más. Entre los parámetros posibles también podemos escoger :complete que nos ejecutará alguna acción de autocompletado cuando tras indicar la etiqueta personalizada del enlace y pulsar «enter». Como aquí lo que me interesa es que me autocomplete la ruta hacia la fuente, añadiré a ese parámetro esta función:

(defun accion-autocompletado-link-fuente (&optional arg)
  (interactive)
  (let
      ((fuente (read-file-name "Fuente (ruta hacia): ")))
    (format "tipo:%s" fuente)))

Ya podemos, por último, definir nuestro nuevo enlace, que llevará la etiqueta tipo: y será además de color naranja:

(org-link-set-parameters "tipo"
                         :follow 'acciones-org-link-fuente
                         :face '(:foreground "orange" :underline t)
                         :complete 'accion-autocompletado-link-fuente)

Así, si tecleamos C-c C-l, que llama al comando org-insert-link, escribimos «tipo:» cuando el minibúfer nos pregunta por el enlace, seguido de la ruta hacia la fuente. Si queremos ayudarnos de un autocompletado para escribir la ruta, bastaría con pulsar «enter» justo tras escribir la etiqueta «tipo:».

link-fuentes-org.png

Publicado: 19/08/20

Última actualización: 21/01/22


Índice general

Acerca de...

Esta obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial 4.0 Internacional.

© Juan Manuel Macías
Creado con esmero en
GNU Emacs