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:
- 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.
- 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íanombre-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
Esta obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial 4.0 Internacional.