org-kebiasaan grafik pada tampilan agenda daftar agenda

8

Saya menggunakan kebiasaan-org, dan grafik kebiasaan muncul dengan baik pada tampilan agenda normal. Namun, saya ingin menggunakan daftar todo dengan pemfilteran tag, dan di sana kebiasaan terlihat seperti item todo normal, tanpa grafik kebiasaan.

Bagaimana saya bisa membuat grafik kebiasaan muncul ketika menggunakan tampilan agenda daftar agenda?

legoscia
sumber
Saya tidak berpikir grafik konsistensi dirancang sekitar muncul di mana saja tetapi 'agenda' ketik agenda (jadi tidak ada daftar todo, dll). Apa yang dapat Anda lakukan adalah menyesuaikan agenda blok dengan blok untuk daftar tag todo yang Anda inginkan dan grafik konsistensi kebiasaan. Agenda khusus bisa sedikit rumit.
Subhan Michael Tindall

Jawaban:

4

Ini sepertinya melakukan trik:

(defvar my/org-habit-show-graphs-everywhere nil
  "If non-nil, show habit graphs in all types of agenda buffers.

Normally, habits display consistency graphs only in
\"agenda\"-type agenda buffers, not in other types of agenda
buffers.  Set this variable to any non-nil variable to show
consistency graphs in all Org mode agendas.")

(defun my/org-agenda-mark-habits ()
  "Mark all habits in current agenda for graph display.

This function enforces `my/org-habit-show-graphs-everywhere' by
marking all habits in the current agenda as such.  When run just
before `org-agenda-finalize' (such as by advice; unfortunately,
`org-agenda-finalize-hook' is run too late), this has the effect
of displaying consistency graphs for these habits.

When `my/org-habit-show-graphs-everywhere' is nil, this function
has no effect."
  (when (and my/org-habit-show-graphs-everywhere
         (not (get-text-property (point) 'org-series)))
    (let ((cursor (point))
          item data) 
      (while (setq cursor (next-single-property-change cursor 'org-marker))
        (setq item (get-text-property cursor 'org-marker))
        (when (and item (org-is-habit-p item)) 
          (with-current-buffer (marker-buffer item)
            (setq data (org-habit-parse-todo item))) 
          (put-text-property cursor
                             (next-single-property-change cursor 'org-marker)
                             'org-habit-p data))))))

(advice-add #'org-agenda-finalize :before #'my/org-agenda-mark-habits)

Untuk menjelaskan lebih lanjut, tampak bahwa setiap fungsi agenda memanggil org-agenda-finalizesetelah buffer agenda sebagian besar dibangun, dan ini adalah fungsi yang menambahkan grafik kebiasaan. Selain itu, itu hanya menambahkan grafik ke setiap item yang memiliki org-habit-pproperti teks (yang mengkodekan detail yang akan ditampilkan grafik). Jadi yang perlu kita lakukan adalah memeriksa dan menandai kebiasaan dengan informasi ini di beberapa titik sebelum itu.

Juga, saya memilih untuk membuat perilaku ini bergantung pada variabel karena ini harus memungkinkan Anda untuk mengatur variabel dalam perintah agenda kustom, jika Anda ingin hanya beberapa agenda untuk menampilkan kebiasaan. Saya belum mengujinya, tetapi tidak ada alasan mengapa itu tidak berhasil.

EDIT: Solusi asli saya punya masalah dengan agenda blok. Ternyata itu org-agenda-finalizedipanggil satu kali untuk setiap blok, dan kemudian satu kali untuk agenda secara keseluruhan. Ketika panggilan terakhir itu terjadi, agendanya hanya-baca, sehingga kesalahan terjadi jika agendanya mengandung kebiasaan. Karena semua pekerjaan telah dilakukan pada saat itu, tidak masuk akal untuk memindai agenda lagi, dan saya hanya menambahkan cek untuk properti 'org-series, yang ditambahkan ke seluruh agenda setelah panggilan per-blok dan sebelum panggilan read-only akhir.

Aaron Harris
sumber
1

Anda dapat menggunakan org-agenda-prefix-formatdengan panggilan ke org-habit-build-graphdan fungsi terkait.

Pug lucu
sumber