Cela semble faire l'affaire:
(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)
Pour expliquer davantage, il semble que chaque fonction d'agenda appelle
org-agenda-finalize
une fois que le tampon d'agenda a été principalement construit, et c'est la fonction qui ajoute les graphiques d'habitude. De plus, il ajoute simplement le graphique à chaque élément qui a la
org-habit-p
propriété text (qui code les détails que le graphique affichera). Donc, tout ce que nous devons faire est de passer en revue et d'étiqueter les habitudes avec ces informations à un moment donné avant cela.
De plus, j'ai choisi de faire dépendre ce comportement d'une variable car cela devrait vous permettre de définir la variable dans des commandes d'agenda personnalisées, si vous ne voulez que certains agendas pour afficher les habitudes. Je n'ai pas testé cela, mais il n'y a aucune raison que cela ne fonctionne pas.
EDIT: Ma solution d'origine avait des problèmes avec les agendas de blocs. Il s'avère qu'il org-agenda-finalize
est appelé une fois pour chaque bloc, puis une fois pour l'agenda dans son ensemble. Lorsque cet appel final se produit, l'agenda est en lecture seule, donc une erreur est levée si l'agenda contient des habitudes. Étant donné que tout le travail a déjà été effectué à ce stade, cela n'a aucun sens de scanner à nouveau l'agenda de toute façon, et je viens d'ajouter une vérification pour la propriété 'org-series, qui est ajoutée à l'agenda entier après les appels par bloc et avant l'appel final en lecture seule.