gráfico org-habit na exibição da agenda da lista de tarefas

8

Estou usando o org-hábito, e os gráficos de hábito aparecem bem na exibição normal da agenda. No entanto, eu gostaria de usar a lista de tarefas com filtragem de tags, e os hábitos parecem itens de tarefas normais, sem o gráfico de hábitos.

Como faço para que o gráfico de hábitos apareça ao usar a exibição da agenda da lista de tarefas?

legoscia
fonte
Eu não acho que os gráficos de consistência sejam projetados para aparecer em qualquer lugar, exceto nas agendas do tipo 'agenda' (portanto, nenhuma lista de tarefas, etc.). O que você pode fazer é personalizar uma agenda de blocos com blocos para a lista de tarefas de tags desejada e para os gráficos de consistência de hábitos. Agendas personalizadas podem ser um pouco complicadas.
Subhan Michael Tindall

Respostas:

4

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-finalizedepois 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-ppropriedade 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.

Aaron Harris
fonte
1

Você pode usar org-agenda-prefix-formatcom uma chamada para org-habit-build-graphe funções relacionadas.

Pug fofo
fonte