¿Hacer que org-blank-before-new-entry distinga entre una lista TODO y un esquema de texto?

10

Como muchos de nosotros, uso el modo org para dos cosas diferentes:

  1. Como gestor de listas TODO
  2. Como un esquema de texto

Me gustaría que mis líneas en blanco funcionen de manera diferente según el contexto.

  1. Lista TODO: sin líneas en blanco
  2. esquema de texto: inserte automáticamente 1 línea en blanco cuando el texto sin encabezado precede a un encabezado

En otras palabras, cuando estoy haciendo una lista TODO cuando tengo muchos encabezados seguidos, no quiero saltos de línea perdidos entre ellos.

Modo de lista TODO, sin saltos de línea:

* Organize Party [33%]
 ** TODO Call people [1/2]
 *** TODO Peter
 *** DONE Sarah
 ** TODO Buy food
 ** DONE Talk to neighbor 

Sin embargo, cuando escribo texto, quiero saltos de línea por el espacio en blanco visual / facilidad de lectura.

modo de esquema, línea en blanco antes del encabezado:

* Heading 
This is a document that has a heading, and a body. The body will consist of two paragraphs with sub-headings.

* Body  
This is an introduction to the body. The body has two sub-headings, each of which have their own paragraph.  

** The First Paragraph  
This is the first of two paragraphs. 

** The Second Paragraph
This is the second of two paragraphs.  

Ya configuré org-blank-before-new-entry en auto:

 ((heading . auto)
 (plain-list-item . auto))

Pero creo que org-blank-before-new-entry funciona detectando otras líneas en blanco en el área. Quiero que detecte si la línea de texto anterior es un encabezado o no.

¿Cómo puedo modificar org-blank-before-new-entry para que cuando esté en una lista TODO que consta solo de encabezados, org-meta-returnno agregue un salto de línea? pero después de un bloque de texto, lo hace?

hombre incandescente
fuente
¿Has encontrado una solución para esto? Intenté hacer la misma pregunta en el subreddit de emacs hace un tiempo, pero fue en vano.
MajorBriggs
Sí, a través de una función personalizada. Voy a publicar.
incandescentman

Respuestas:

5

Esto se puede hacer creando una función personalizada que verifique si está en un encabezado de organización.

(setq org-blank-before-new-entry
      '((heading . always)
       (plain-list-item . nil)))

(defun call-rebinding-org-blank-behaviour (fn)
  (let ((org-blank-before-new-entry
         (copy-tree org-blank-before-new-entry)))
    (when (org-at-heading-p)
      (rplacd (assoc 'heading org-blank-before-new-entry) nil))
    (call-interactively fn)))

(defun smart-org-meta-return-dwim ()
  (interactive)
  (call-rebinding-org-blank-behaviour 'org-meta-return))

(defun smart-org-insert-todo-heading-dwim ()
  (interactive)
  (call-rebinding-org-blank-behaviour 'org-insert-todo-heading))

(define-key org-mode-map (kbd "M-<return>") 'smart-org-meta-return-dwim) 
hombre incandescente
fuente
1
¿Cómo podría conseguir este trabajo para las otras tres formas de insertar títulos, así: C-ret(org-insert-encabezamiento-respeto-contenido), M-S-return(org-insert-todo-encabezamiento) y C-S-return(org-insert-todo-encabezamiento respeto -contenido)?
MajorBriggs
Para aclarar: org-insert-todo-headingno funciona incluso si lo asocio a una clave como esta: (define-key org-mode-map (kbd "MS- <return>") 'smart-org-insert-todo-header-dwim)
MajorBriggs