org-mode – ¿Doblar bloques fuente al ocultar sus entradas?

Pregunta:

P: ¿Cómo puedo hacer que los bloques fuente se plieguen automáticamente cuando oculto el contenido de su entrada?

Me gustaría que los bloques de código fuente se plieguen automáticamente cada vez que oculto una entrada para que siempre estén fuera del camino hasta que específicamente quiera verlos. Sin embargo, fuera de la caja, su visibilidad parece ser independiente de la visibilidad de la entrada de su casa.

Por ejemplo, si tengo:

* An entry
  #+begin_src R
    x <- 1:10
  #+end_src

Some descriptive text.

Puedo alternar la visibilidad del bloque fuente con TAB cuando el punto está en la línea begin_src . Sin embargo, cuando oculto (doblo) la entrada y luego la muestro (despliegue) de nuevo, el bloque fuente parece recordar su estado de visibilidad anterior: si estaba visible / abierto, será visible cuando muestre / despliegue la entrada, y si era invisible / cerrado, será invisible / cerrado cuando muestre / despliegue la entrada.

Quiero plegar / ocultar mis bloques de origen automáticamente cada vez que doblo / oculto la entrada que los contiene. ¿Cómo puedo hacer eso?

PD: Acabo de aprender a usar bloques de código fuente, por lo que es posible que me esté perdiendo una solución obvia. Disculpas si es así.

Respuesta:

En emacs 25.1 hay org-cycle-hook . He robado org-cycle-hide-drawers y lo he adaptado al caso de los bloques. El código resultante a continuación hace exactamente lo que desea en emacs 25.1.

(defun org-cycle-hide-blocks (state &optional exceptions)
  "Re-hide all blocks after a visibility state change.
When non-nil, optional argument EXCEPTIONS is a list of strings
specifying which blocks should not be hidden."
  (when (and (derived-mode-p 'org-mode)
         (not (memq state '(overview folded contents))))
    (save-excursion
      (let* ((globalp (memq state '(contents all)))
             (beg (if globalp (point-min) (point)))
             (end (if globalp (point-max)
            (if (eq state 'children)
            (save-excursion (outline-next-heading) (point))
              (org-end-of-subtree t)))))
    (goto-char beg)
    (while (re-search-forward org-block-regexp (max end (point)) t)
      (unless (member-ignore-case (match-string 1) exceptions)
        (let ((block (org-element-at-point)))
          (when (memq (org-element-type block) '(src-block))
        (org-hide-block-toggle t)
        ;; Make sure to skip block entirely or we might flag
        ;; it another time when matching its ending line with
        ;; `org-block-regexp'.
        (goto-char (org-element-property :end block))))))))))

(add-hook 'org-cycle-hook 'org-cycle-hide-blocks)

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım