Organisationsgewohnheitsdiagramm in der Tagesordnungsansicht der Aufgabenliste

8

Ich verwende Org-Habit und die Habit-Diagramme werden in der normalen Agenda-Ansicht gut angezeigt. Ich möchte jedoch die Aufgabenliste mit Tag-Filterung verwenden, und dort sehen die Gewohnheiten wie normale Aufgabenelemente ohne das Gewohnheitsdiagramm aus.

Wie kann ich das Gewohnheitsdiagramm anzeigen lassen, wenn ich die Agenda-Ansicht der Aufgabenliste verwende?

Legoscia
quelle
Ich glaube nicht, dass die Konsistenzdiagramme so gestaltet sind, dass sie irgendwo anders als auf Tagesordnungen vom Typ "Agenda" angezeigt werden (also keine Aufgabenliste usw.). Möglicherweise können Sie eine Blockagenda mit Blöcken sowohl für die gewünschte Tag-ToDo-Liste als auch für die Gewohnheiten-Konsistenzdiagramme anpassen. Benutzerdefinierte Agenden können jedoch etwas schwierig sein.
Subhan Michael Tindall

Antworten:

4

Dies scheint den Trick zu tun:

(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)

Zur weiteren Erläuterung scheint es, dass jede Agenda-Funktion aufgerufen wird, org-agenda-finalizesobald der Agenda-Puffer größtenteils erstellt wurde, und dies ist die Funktion, die die Gewohnheitsgraphen hinzufügt. Darüber hinaus wird das Diagramm nur zu jedem Element hinzugefügt, das über die Texteigenschaft verfügt org-habit-p(die die Details codiert, die im Diagramm angezeigt werden). Alles, was wir tun müssen, ist, die Gewohnheiten irgendwann vorher mit diesen Informationen zu versehen.

Außerdem habe ich mich dafür entschieden, dieses Verhalten von einer Variablen abhängig zu machen, da dies es Ihnen ermöglichen sollte, die Variable in benutzerdefinierten Agenda-Befehlen festzulegen, wenn nur einige Agenden Gewohnheiten anzeigen sollen. Ich habe das nicht getestet, aber es gibt keinen Grund, warum es nicht funktionieren sollte.

EDIT: Meine ursprüngliche Lösung hatte Probleme mit Blockagenden. Es stellt sich heraus, dass dies org-agenda-finalizeeinmal für jeden Block und dann einmal für die gesamte Agenda aufgerufen wird. Wenn dieser letzte Aufruf erfolgt, ist die Agenda schreibgeschützt, sodass ein Fehler ausgegeben wird, wenn die Agenda Gewohnheiten enthält. Da die gesamte Arbeit zu diesem Zeitpunkt bereits erledigt ist, ist es ohnehin nicht sinnvoll, die Agenda erneut zu scannen, und ich habe gerade eine Überprüfung für die Eigenschaft 'org-series' hinzugefügt, die nach den Blockaufrufen zur gesamten Agenda hinzugefügt wird und vor dem letzten schreibgeschützten Aufruf.

Aaron Harris
quelle
1

Sie können org-agenda-prefix-formatmit einem Aufruf org-habit-build-graphund verwandten Funktionen verwenden.

Netter Mops
quelle