Cuaderno de GNUtas

Aislar un sub-árbol en Org Mode (revisitado)

Una de las cosas más prácticas (y recomendables) que podemos hacer dentro de un documento de Org Mode es aislar los encabezados y árboles donde queremos centrar el foco. Esto se puede lograr de múltiples maneras, y ya habíamos comentado aquí, hace mucho tiempo ya, ciertas estrategias de aislamiento que ahora veo un tanto «anticuadas». Y es que con el uso y las costumbres me he acabado dando cuenta de que lo que más práctico me resulta es contar con varios árboles aislados (según los voy aislando, en mi flujo de trabajo, quiero decir) como búferes independientes a los que volver siempre que me apetezca. La función org-tree-to-indirect-buffer no permite hacer eso de entrada, pues cada vez que la volvemos a invocar sustituye el sub-árbol aislado por el nuevo. Este comportamiento lo podemos evitar si llamamos a la función con un prefijo universal (C-u), pero como no me acababa de convencer el resultado, además de que la forma de nombrar los nuevos búferes me resultaba un tanto confusa a la hora de regresar a ellos. Así que garrapateé esta versión personal, que sin demasiada originalidad he llamado mi-org-tree-to-indirect-buffer. Pasemos a explicarla.

Para esta función partí de dos deseos, a saber, quería que:

  1. el sub-árbol se aislara en la ventana presente, no en una ventana contigua abierta ad hoc. Es decir, que cuando aíslo el sub-árbol mediante ese procedimiento significa que voy a estar un tiempo más o menos largo allí, y saltar a la ventana contigua me supone un pequeño esfuerzo extra.
  2. el nuevo búfer resultante se nombrara de acuerdo a unas pautas mecánicas, de tal forma que quedase nombre-del-archivo::encabezado-del-subárbol. La cadena «::» resulta útil a la hora de hacer una búsqueda en Helm, pues a poco que la tecleo ya se me muestra la lista de sub-árboles que tengo aislados. Por supuesto, si aislamos un sub-sub-árbol dentro del sub-árbol, el búfer resultante se llamaría nombre-del-archivo::encabezado-del-sub-árbol::encabezado-del-sub-sub-árbol. Y así sucesivamente.

Vamos, entonces, a meternos en harina con la función:

(defun mi-org-tree-to-indirect-buffer ()
  (interactive)
  (let ((buf (buffer-name))

es necesario un condicional, en caso de que el título del encabezado sea (o incluya) un enlace, para que no nos entregue una cadena demasiado larga como nombre del nuevo búfer. Si el enlace lleva una descripción, lo que usará entonces es la cadena de texto de la descripción:

(ind-buf (replace-regexp-in-string
        org-link-bracket-re
        (lambda (x)
          (pcase (match-string 2 x)
            (`nil (match-string 1 x))
            ((pred stringp) (match-string 2 x))))
        (nth 4 (org-heading-components))))

damos el valor apropiado para que el antiguo org-tree-to-indirect-buffer sea invocado con un prefijo universal y no sustituya el nuevo búfer por el anterior en cada acción:

(current-prefix-arg '(4)) ; c-u

la variable org-indirect-buffer-display debe tener este valor para que el nuevo búfer no se abra en una ventana contigua:

(org-indirect-buffer-display 'current-window))

y una vez cerrada nuestra lista de variables locales, llamamos interactivamente a la versión de fábrica de la función y renombramos el nuevo búfer según la pauta que comentamos más arriba:

(call-interactively 'org-tree-to-indirect-buffer)
(rename-buffer (concat buf "::" ind-buf))))

En resumidas cuentas, nuestra funcioncilla, resultona y práctica, quedaría tal que así:

(defun mi-org-tree-to-indirect-buffer ()
  (interactive)
  (let ((buf (buffer-name))
(ind-buf (replace-regexp-in-string
        org-link-bracket-re
        (lambda (x)
          (pcase (match-string 2 x)
            (`nil (match-string 1 x))
            ((pred stringp) (match-string 2 x))))
        (nth 4 (org-heading-components))))
(current-prefix-arg '(4)) ; c-u
(org-indirect-buffer-display 'current-window))
(call-interactively 'org-tree-to-indirect-buffer)
(rename-buffer (concat buf "::" ind-buf))))

Publicado: 12/05/21

Última actualización: 16/08/23


Í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