заставить org-blank-before-new-entry различать список TODO и текстовую схему?

10

Как и многие из нас, я использую org-mode для двух разных вещей:

  1. Как менеджер списка TODO
  2. Как текстовый планировщик

Я бы хотел, чтобы мои пустые строки работали по-разному в зависимости от контекста.

  1. Список TODO: нет пустых строк
  2. набросок текста: автоматически вставлять 1 пустую строку, если заголовок текста не предшествует заголовку

Другими словами, когда я делаю список TODO, когда у меня много заголовков подряд, я не хочу, чтобы между ними возникали случайные разрывы строк.

Режим списка TODO, без разрывов строк:

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

Тем не менее, когда я пишу текст, я хочу разрывы строк для визуального пробела / простоты чтения.

режим контура, пустая строка перед заголовком:

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

Я уже установил для org-blank-before-new-entry значение auto:

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

Но я думаю, что org-blank-before-new-entry работает, обнаруживая другие пустые строки в этой области. Я хочу, чтобы он обнаружил, является ли предыдущая строка текста заголовком или не заголовком.

Как я могу изменить org-blank-before-new-entry, чтобы при org-meta-returnдобавлении разрыва строки в списке TODO, состоящем только из заголовков ? но после блока текста это делает?

incandescentman
источник
Вы нашли исправление для этого? Некоторое время назад я пытался задать тот же вопрос о субреддите emacs, но безрезультатно.
MajorBriggs
Да, через пользовательскую функцию. Я отправлю.
Лампа накаливания

Ответы:

5

Это можно сделать, создав пользовательскую функцию, которая проверяет, находится ли она в заголовке организации.

(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
источник
1
Как я могу заставить это работать для трех других способов вставки заголовков, а также: C-ret(org-insert-heading -pect-content), M-S-return(org-insert-todo-heading) и C-S-return(org-insert-todo-heading -pect -поперечник)?
MajorBriggs
Чтобы уточнить: org-insert-todo-headingне работает, даже если я связываю его с ключом, подобным этому: (define-key org-mode-map (kbd "MS- <return>") 'smart-org-insert-todo-heading-dwim)
MajorBriggs