Điều này dường như để thực hiện các mẹo:
(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)
Để giải thích thêm, có vẻ như mọi hàm chương trình nghị sự đều gọi
org-agenda-finalize
một khi bộ đệm chương trình nghị sự đã được xây dựng chủ yếu và đây là chức năng bổ sung các biểu đồ thói quen. Hơn nữa, nó chỉ thêm biểu đồ vào mỗi mục có thuộc tính
org-habit-p
văn bản (mã hóa các chi tiết mà biểu đồ sẽ hiển thị). Vì vậy, tất cả những gì chúng ta cần làm là trải qua và gắn thẻ các thói quen với thông tin này tại một số điểm trước đó.
Ngoài ra, tôi đã chọn thực hiện hành vi này phụ thuộc vào một biến vì điều này sẽ cho phép bạn đặt biến trong các lệnh chương trình nghị sự tùy chỉnh, nếu bạn chỉ muốn một số chương trình nghị sự hiển thị thói quen. Tôi đã không kiểm tra điều đó, nhưng không có lý do gì nó không hoạt động.
EDIT: Giải pháp ban đầu của tôi có vấn đề với chương trình nghị sự. Nó chỉ ra rằng org-agenda-finalize
được gọi một lần cho mỗi khối, và sau đó một lần cho toàn bộ chương trình nghị sự. Khi cuộc gọi cuối cùng đó xảy ra, chương trình nghị sự chỉ đọc, do đó, một lỗi sẽ được đưa ra nếu chương trình nghị sự có bất kỳ thói quen nào. Vì tất cả các công việc đã được thực hiện vào thời điểm đó, nên không có ý nghĩa gì khi quét chương trình nghị sự một lần nữa và tôi chỉ thêm một kiểm tra cho thuộc tính 'org-series, được thêm vào toàn bộ chương trình nghị sự sau các cuộc gọi theo từng khối và trước cuộc gọi chỉ đọc cuối cùng.