Isso parece fazer o truque:
(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)
Para explicar melhor, parece que todas as funções da agenda são chamadas
org-agenda-finalize
depois que o buffer da agenda é construído, e essa é a função que adiciona os gráficos de hábitos. Além disso, apenas adiciona o gráfico a cada item que possui a
org-habit-p
propriedade text (que codifica os detalhes que o gráfico exibirá). Então, tudo o que precisamos fazer é seguir e marcar os hábitos com essas informações em algum momento anterior a isso.
Além disso, escolhi fazer com que esse comportamento dependesse de uma variável, pois isso permitirá que você defina a variável em comandos personalizados da agenda, se desejar que apenas algumas agendas exibam hábitos. Eu não testei isso, mas não há razão para que não funcione.
EDIT: Minha solução original teve problemas com as agendas de blocos. Acontece que org-agenda-finalize
é chamado uma vez para cada bloco e depois uma vez para a agenda como um todo. Quando essa chamada final acontece, a agenda é somente leitura, portanto, um erro é gerado se a agenda contiver algum hábito. Como todo o trabalho já foi realizado nesse ponto, não faz sentido verificar a agenda novamente de qualquer maneira, e acabei de adicionar uma verificação para a propriedade 'org-series, que é adicionada a toda a agenda após as chamadas por bloco e antes da chamada final somente leitura.