Questo sembra fare il trucco:
(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)
Per spiegare ulteriormente, sembra che ogni funzione dell'agenda venga chiamata
org-agenda-finalize
una volta che il buffer dell'agenda è stato costruito principalmente, e questa è la funzione che aggiunge i grafici delle abitudini. Inoltre, aggiunge semplicemente il grafico a ogni elemento che ha la
org-habit-p
proprietà text (che codifica i dettagli che il grafico mostrerà). Quindi tutto ciò che dobbiamo fare è passare attraverso e taggare le abitudini con queste informazioni ad un certo punto prima di quello.
Inoltre, ho scelto di fare in modo che questo comportamento dipenda da una variabile perché ciò dovrebbe consentire di impostare la variabile nei comandi dell'agenda personalizzati, se si desidera che solo alcune agende mostrino le abitudini. Non l'ho provato, ma non c'è motivo per cui non dovrebbe funzionare.
EDIT: la mia soluzione originale aveva problemi con i programmi di blocco. Si scopre che org-agenda-finalize
viene chiamato una volta per ogni blocco, quindi una volta per l'agenda nel suo insieme. Quando si verifica l'ultima chiamata, l'agenda è di sola lettura, quindi viene generato un errore se l'agenda contiene delle abitudini. Dal momento che tutto il lavoro è già stato svolto a quel punto, non ha senso scansionare nuovamente l'agenda, e ho appena aggiunto un controllo per la proprietà 'org-series, che viene aggiunta all'intera agenda dopo le chiamate per blocco e prima della chiamata di sola lettura finale.