fazer org-blank-before-new-distinguing entre uma lista de tarefas e um esboço de texto?

10

Como muitos de nós, uso o modo organizacional para duas coisas diferentes:

  1. Como gerente de lista do TODO
  2. Como um esboço de texto

Gostaria que minhas linhas em branco funcionassem de maneira diferente com base no contexto.

  1. Lista de tarefas: sem linhas em branco
  2. contorno do texto: insira automaticamente 1 linha em branco quando o texto sem título preceder um título

Em outras palavras, quando estou fazendo uma lista TODO quando tenho muitos títulos seguidos, não quero quebras de linha perdidas entre eles.

Modo de lista TODO, sem quebras de linha:

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

No entanto, quando estou escrevendo texto, quero quebras de linha em nome do espaço em branco visual / facilidade de leitura.

modo de contorno, linha em branco antes do cabeçalho:

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

Eu já configurei org-blank-before-new-entry para auto:

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

Mas acho que o org-blank-before-new-entry funciona detectando outras linhas em branco na área. Quero que ele detecte se a linha de texto anterior é um cabeçalho ou não.

Como modificar org-blank-before-new-entry para que, quando estou em uma lista TODO composta apenas por títulos, org-meta-returnnão adicione uma quebra de linha? mas depois de um bloco de texto, ele faz?

homem incandescente
fonte
Você encontrou uma correção para isso? Eu tentei fazer a mesma pergunta no subreddit do emacs há um tempo, mas sem sucesso.
MajorBriggs
Sim, através de uma função personalizada. Vou postar.
Incandescentman

Respostas:

5

Isso pode ser feito criando uma função personalizada que verifica se está em um cabeçalho organizacional.

(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) 
homem incandescente
fonte
11
Como eu poderia começar este trabalho para as três outras maneiras de inserir títulos, assim: C-ret(org-insert-rubrica respeito ao conteúdo), M-S-return(org-insert-todo-título) e C-S-return(org-insert-todo-rubrica respeito -conteúdo)?
MajorBriggs
Para esclarecer: org-insert-todo-headingnão funciona mesmo que eu o vincule a uma chave como esta: (define-chave org-mode-map (kbd "MS- <return>") 'smart-org-insert-todo-header-dwim)
MajorBriggs