đồ thị org-thói quen trên danh sách chương trình nghị sự để làm


8

Tôi đang sử dụng thói quen org và các biểu đồ thói quen hiển thị độc đáo trên chế độ xem chương trình nghị sự thông thường. Tuy nhiên, tôi muốn sử dụng danh sách việc cần làm với lọc thẻ và ở đó các thói quen trông giống như các mục việc cần làm bình thường, không có biểu đồ thói quen.

Làm cách nào tôi có thể làm cho biểu đồ thói quen xuất hiện khi sử dụng chế độ xem chương trình nghị sự của danh sách việc cần làm?


Tôi không nghĩ các biểu đồ tính nhất quán được thiết kế xung quanh hiển thị ở bất kỳ đâu ngoài các chương trình nghị sự loại 'chương trình nghị sự' (vì vậy không có danh sách việc cần làm, v.v.). Những gì bạn có thể làm là tùy chỉnh một chương trình nghị sự khối với các khối cho cả danh sách việc cần làm mà bạn muốn và biểu đồ tính nhất quán của thói quen. Chương trình nghị sự tùy chỉnh có thể là một chút khó khăn mặc dù.
Subhan Michael Tindall

Câu trả lời:


4

Đ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-finalizemộ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-pvă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.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.