membuat org-blank-before-new-entry membedakan antara daftar TODO dan garis besar teks?

10

Seperti kebanyakan dari kita, saya menggunakan mode-org untuk dua hal berbeda:

  1. Sebagai pengelola daftar TODO
  2. Sebagai outliner teks

Saya ingin baris kosong saya bekerja berbeda berdasarkan konteks.

  1. Daftar TODO: tidak ada garis kosong
  2. outline teks: secara otomatis memasukkan 1 baris kosong ketika teks non-heading mendahului heading

Dengan kata lain, ketika saya melakukan daftar TODO ketika saya memiliki banyak judul berturut-turut, saya tidak ingin garis putus-putus menyimpang di antara mereka.

Mode daftar TODO, tidak ada jeda baris:

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

Namun, ketika saya sedang menulis teks, saya ingin jeda baris demi ruang putih visual / kemudahan membaca.

mode garis besar, garis kosong sebelum pos:

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

Saya telah menetapkan org-blank-before-new-entry ke otomatis:

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

Tapi saya pikir org-blank-before-new-entry berfungsi dengan mendeteksi garis-garis kosong lainnya di area tersebut. Saya ingin mendeteksi apakah baris teks sebelumnya adalah heading atau bukan heading.

Bagaimana saya bisa memodifikasi org-blank-before-new-entry sehingga ketika saya berada di daftar TODO yang hanya terdiri dari heading, org-meta-returntidak menambahkan baris baru? tapi setelah satu blok teks, ya?

pijar
sumber
Sudahkah Anda menemukan perbaikan untuk ini? Saya mencoba mengajukan pertanyaan yang sama pada subreddit emacs beberapa waktu lalu tetapi tidak berhasil.
MajorBriggs
Ya, melalui fungsi khusus. Saya akan memposting.
incandescentman

Jawaban:

5

Ini dapat dilakukan dengan membuat fungsi kustom yang memeriksa untuk melihat apakah itu pada heading org.

(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) 
pijar
sumber
1
Bagaimana saya bisa membuat ini berfungsi untuk tiga cara lain untuk memasukkan pos, juga: C-ret(org-insert-heading-respect-content), M-S-return(org-insert-todo-heading) dan C-S-return(org-insert-todo-heading-respect) -kandungan)?
MajorBriggs
Untuk memperjelas: org-insert-todo-headingtidak berfungsi walaupun saya mengikatnya ke kunci seperti ini: (define-key org-mode-map (kbd "MS- <return>") 'smart-org-insert-todo-heading-dwim)
MajorBriggs