org-habit graph on todo list agenda view

8

J'utilise org-habit, et les graphiques d'habitude apparaissent bien sur la vue normale de l'agenda. Cependant, je voudrais utiliser la liste des tâches avec le filtrage des balises, et là, les habitudes ressemblent à des tâches normales, sans le graphique des habitudes.

Comment faire apparaître le graphique d'habitude lors de l'utilisation de la vue de l'agenda de la liste des tâches?

legoscia
la source
Je ne pense pas que les graphiques de cohérence sont conçus pour apparaître n'importe où, mais des agendas de type «agenda» (donc pas de liste de tâches, etc.). Ce que vous pourriez être en mesure de personnaliser un agenda de blocs avec des blocs pour la liste de tâches des balises que vous souhaitez et les graphiques de cohérence des habitudes. Les agendas personnalisés peuvent cependant être un peu délicats.
Subhan Michael Tindall

Réponses:

4

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-finalizeune 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-pproprié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-finalizeest 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.

Aaron Harris
la source
1

Vous pouvez utiliser org-agenda-prefix-formatavec un appel à org-habit-build-graphet des fonctions connexes.

Carlin mignon
la source