Cuaderno de GNUtas

Aislar un árbol en Org Mode

Trabajar en Org Mode nos puede llevar en no pocas ocasiones a ramificarnos casi hasta el infinito: árboles, de donde surgen árboles, y de allí más árboles, etc. Por supuesto, Org nos proporciona recursos de sobra para tener bajo control esas frondosidades, y por tanto no acabar perdiéndonos. Si no lo hiciese, ni lo hiciese bien, entonces no sería Org. Recordemos que el unicornio está para hacernos la vida un poco menos triste. Ya podremos perdernos por otras calles y otras selvas, incluso por otros pensamientos. Pero en un documento de Org, con un mínimo de buenas prácticas, es difícil extraviar el norte.

Ahora bien, en ocasiones (muchas) desearemos centrarnos en un único árbol o «sub-árbol» para trabajar en él. Y aislarnos del resto. Por ejemplo, en mi traducción de la Odisea, sin ir más lejos, cada canto es un árbol, que contiene no sólo mi traducción propiamente dicha, sino más árboles donde incluyo comentarios y notas no exportables. ¿Cómo separo un árbol determinado del resto, y me aíslo con él para escribir o revisar su contenido? La forma que prefiero (hay más) es recurrir a la función org-tree-to-indirect-buffer, que está asociada a la combinación de teclas C-c C-x b. Si pulsamos esta secuencia en Emacs, de inmediato se nos abre otra ventana donde encontraremos nuestro árbol en un búfer temporal, que depende del documento principal en que estamos trabajando. Es decir, que cualquier modificación hecha en ese búfer afectará a todo el conjunto. Si guardamos allí con C-x C-s, se guardará el documento entero. Luego, para terminar de aislarnos, nos trasladamos a la ventana del nuevo búfer y eliminamos el resto de ventanas (C-x 1). Y ya estaremos solos frente a nuestro texto. Son unas cuantas combinaciones de teclas que encadenar de forma mecánica, así que lo mejor (si vamos a hacer esto muy a menudo) es definir una función en nuestro archivo de inicio, que englobe todos esos pasos, para luego asignarle un atajo de teclado más simple. La función podemos definirla así:

(defun aisla-subtree ()
  (interactive)
  (org-tree-to-indirect-buffer) ;; abre una ventana con un búfer temporal
  (other-window 1) ;; nos translada a esa nueva ventana
  (delete-other-windows)) ;; elimina el resto de ventanas

Y acto seguido, asignamos nuestro atajo a la nueva función:

(global-set-key (kbd "C-x 5") 'aisla-subtree)

Cuando hemos aislado nuestro árbol, igual vamos a querer también que el texto nos aparezca más centrado, y que se abran algo los márgenes izquierdo y derecho. Hay algunos modos para Emacs que hacen algo así y que se suponen que están pensados para crear un entorno libre de distracciones, pero por varias razones no me acabaron de convencer. Y, al fin y al cabo, modificar los márgenes en un búfer de Emacs no es que tenga mucho misterio. Podemos usar la función set-window-margins, que tiene como argumentos el márgen izquierdo y derecho en números enteros que representan caracteres simples. Lo malo es que así sólo modificaremos los márgenes temporalmente. Si visitamos otro búfer y luego volvemos al anterior, los cambios no se habrán conservado. Mejor usar las variables left-margin-width y right-margin-width, cuayas modificaciones son permanentes. Pero no son instantáneas, sino que tendríamos que visitar otro búfer y regresar para verlas aplicadas: lo contrario de lo anterior. Por suerte, podemos hacerlas instantáneas si aplicamos esta función con sus dos argumentos: (set-window-buffer (selected-window) (current-buffer). Y, claro, podemos añadir todo eso a nuestro código:

;; aislar subtree en un buffer indirecto

(defun aisla-subtree ()
  (interactive)
  (org-tree-to-indirect-buffer)
  (other-window 1)
  (delete-other-windows)
  (setq left-margin-width 20)
  (setq right-margin-width 20)
  (set-window-buffer (selected-window) (current-buffer)))

En mi caso 20 caracteres (o 20 columnas, para ser más preciso) a izquierda y derecha es un valor suficiente para tener el texto más centrado en el búfer temporal.

Publicado: 30/10/2018

Última actualización: 16/08/23


Índice general

Acerca de...

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