私はorg-habitを使用しており、習慣グラフは通常のアジェンダビューにうまく表示されます。ただし、タグフィルタリングを使用してToDoリストを使用したいのですが、習慣は通常のToDoアイテムのように見えますが、習慣グラフはありません。
TODOリストのアジェンダビューを使用しているときに、習慣グラフを表示するにはどうすればよいですか?
私はorg-habitを使用しており、習慣グラフは通常のアジェンダビューにうまく表示されます。ただし、タグフィルタリングを使用してToDoリストを使用したいのですが、習慣は通常のToDoアイテムのように見えますが、習慣グラフはありません。
TODOリストのアジェンダビューを使用しているときに、習慣グラフを表示するにはどうすればよいですか?
回答:
これはトリックを行うようです:
(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)
さらに説明するとorg-agenda-finalize
、アジェンダバッファがほぼ作成されると、すべてのアジェンダ関数が呼び出されるように見え
ます。これは、習慣グラフを追加する関数です。さらに、org-habit-p
textプロパティ(グラフが表示する詳細をエンコードする)を持つすべてのアイテムにグラフを追加するだけ
です。したがって、必要なのは、その前のある時点で、この情報を調べて習慣にタグを付けることだけです。
また、一部のアジェンダだけで習慣を表示したい場合は、カスタムアジェンダコマンドで変数を設定できるため、この動作を変数に依存させることにしました。私はそれをテストしていませんが、動作しない理由はありません。
編集:私の元の解決策はブロックの議題に問題がありました。それはorg-agenda-finalize
、ブロックごとに1回、そしてアジェンダ全体として1回呼び出されることがわかりました。その最後の呼び出しが発生すると、アジェンダは読み取り専用であるため、アジェンダに習慣が含まれている場合はエラーがスローされます。その時点までにすべての作業がすでに完了しているため、アジェンダをもう一度スキャンしても意味がありません。ブロックごとの呼び出しの後にアジェンダ全体に追加される「org-seriesプロパティ」のチェックを追加しただけです最後の読み取り専用呼び出しの前。
と関連関数のorg-agenda-prefix-format
呼び出しで使用できますorg-habit-build-graph
。