gráfico de org-habit en la vista de agenda de la lista de tareas

8

Estoy usando org-habit, y los gráficos de hábitos se muestran muy bien en la vista de agenda normal. Sin embargo, me gustaría usar la lista de tareas pendientes con el filtrado de etiquetas, y allí los hábitos se ven como elementos normales de tareas pendientes, sin el gráfico de hábitos.

¿Cómo puedo hacer que aparezca el gráfico de hábitos al usar la vista de agenda de la lista de tareas?

legoscia
fuente
No creo que los gráficos de coherencia estén diseñados para mostrarse en cualquier lugar que no sean agendas de tipo 'agenda' (por lo que no hay lista de tareas pendientes, etc.). Lo que puede hacer es personalizar una agenda de bloques con bloques tanto para la lista de tareas de las etiquetas que desee como para los gráficos de consistencia de hábitos. Sin embargo, las agendas personalizadas pueden ser un poco complicadas.
Subhan Michael Tindall

Respuestas:

4

Esto parece hacer el truco:

(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 más, parece que cada función de agenda llama org-agenda-finalizeuna vez que el búfer de agenda se ha construido principalmente, y esta es la función que agrega los gráficos de hábitos. Además, solo agrega el gráfico a cada elemento que tiene la org-habit-ppropiedad de texto (que codifica los detalles que mostrará el gráfico). Entonces, todo lo que necesitamos hacer es revisar y etiquetar los hábitos con esta información en algún momento antes de eso.

Además, elegí hacer que este comportamiento dependa de una variable porque esto debería permitirle establecer la variable en comandos de agenda personalizados, si desea que solo algunas agendas muestren hábitos. No lo he probado, pero no hay razón para que no funcione.

EDITAR: Mi solución original tenía problemas con las agendas de bloque. Resulta que org-agenda-finalizese llama una vez para cada bloque, y luego una vez para la agenda en su conjunto. Cuando ocurre esa última llamada, la agenda es de solo lectura, por lo que se genera un error si la agenda contiene algún hábito. Dado que todo el trabajo ya se ha realizado para ese punto, no tiene sentido escanear la agenda de nuevo de todos modos, y acabo de agregar un cheque para la propiedad 'org-series, que se agrega a toda la agenda después de las llamadas por bloque y antes de la última llamada de solo lectura.

Aaron Harris
fuente