faire org-blank-before-new-entry faire la distinction entre une liste TODO et un plan de texte?

10

Comme beaucoup d'entre nous, j'utilise le mode org pour deux choses différentes:

  1. En tant que gestionnaire de liste TODO
  2. Sous forme de texte

J'aimerais que mes lignes vides fonctionnent différemment en fonction du contexte.

  1. Liste TODO: pas de lignes vides
  2. contour du texte: insérer automatiquement 1 ligne vierge lorsque le texte sans en-tête précède un en-tête

En d'autres termes, lorsque je fais une liste TODO lorsque j'ai plusieurs en-têtes de suite, je ne veux pas de sauts de ligne parasites entre eux.

Mode liste TODO, pas de sauts de ligne:

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

Cependant, lorsque j'écris du texte, je veux des sauts de ligne pour des espaces visuels / facilité de lecture.

mode contour, ligne vierge avant l'en-tête:

* 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.  

J'ai déjà défini org-blank-before-new-entry sur auto:

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

Mais je pense que org-blank-before-new-entry fonctionne en détectant d'autres lignes vides dans la zone. Je veux qu'il détecte si la ligne de texte précédente est un titre ou un non-titre.

Comment puis-je modifier org-blank-before-new-entry afin que lorsque je suis dans une liste TODO composée uniquement de titres, org-meta-returnn'ajoute pas de saut de ligne? mais après un bloc de texte, c'est le cas?

incandescentman
la source
Avez-vous trouvé une solution à ce problème? J'ai essayé de poser la même question sur le subreddit emacs il y a quelque temps, mais en vain.
MajorBriggs
Oui, via une fonction personnalisée. Je posterai.
incandescentman

Réponses:

5

Cela peut être fait en créant une fonction personnalisée qui vérifie si elle se trouve sur un en-tête d'organisation.

(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) 
incandescentman
la source
1
Comment pourrais-je faire en sorte que cela fonctionne également pour les trois autres façons d'insérer des en-têtes: C-ret(org-insert-header-respect-content), M-S-return(org-insert-todo-head) et C-S-return(org-insert-todo-header-respect -contenu)?
MajorBriggs
Pour clarifier: org-insert-todo-headingne fonctionne pas même si je le lie à une clé comme celle-ci: (define-key org-mode-map (kbd "MS- <return>") 'smart-org-insert-todo-header-dwim)
MajorBriggs