grafico org-habit nella vista agenda dell'elenco todo


8

Sto usando org-habit e i grafici delle abitudini si presentano bene nella normale vista dell'agenda. Tuttavia, mi piacerebbe usare la lista delle cose da fare con il filtro dei tag, e lì le abitudini sembrano normali oggetti da fare, senza il grafico delle abitudini.

Come posso fare in modo che il grafico delle abitudini appaia quando uso la vista agenda dell'elenco delle cose da fare?


Non penso che i grafici di coerenza siano progettati in modo da essere mostrati ovunque tranne che nei programmi di tipo "agenda" (quindi nessuna lista di cose da fare, ecc.). Quello che potresti essere in grado di fare è personalizzare un'agenda a blocchi con blocchi sia per i tag todo list che desideri sia per i grafici di coerenza delle abitudini. Le agende personalizzate possono essere un po 'complicate.
Subhan Michael Tindall,

Risposte:


4

Questo sembra fare il trucco:

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

Per spiegare ulteriormente, sembra che ogni funzione dell'agenda venga chiamata org-agenda-finalizeuna volta che il buffer dell'agenda è stato costruito principalmente, e questa è la funzione che aggiunge i grafici delle abitudini. Inoltre, aggiunge semplicemente il grafico a ogni elemento che ha la org-habit-pproprietà text (che codifica i dettagli che il grafico mostrerà). Quindi tutto ciò che dobbiamo fare è passare attraverso e taggare le abitudini con queste informazioni ad un certo punto prima di quello.

Inoltre, ho scelto di fare in modo che questo comportamento dipenda da una variabile perché ciò dovrebbe consentire di impostare la variabile nei comandi dell'agenda personalizzati, se si desidera che solo alcune agende mostrino le abitudini. Non l'ho provato, ma non c'è motivo per cui non dovrebbe funzionare.

EDIT: la mia soluzione originale aveva problemi con i programmi di blocco. Si scopre che org-agenda-finalizeviene chiamato una volta per ogni blocco, quindi una volta per l'agenda nel suo insieme. Quando si verifica l'ultima chiamata, l'agenda è di sola lettura, quindi viene generato un errore se l'agenda contiene delle abitudini. Dal momento che tutto il lavoro è già stato svolto a quel punto, non ha senso scansionare nuovamente l'agenda, e ho appena aggiunto un controllo per la proprietà 'org-series, che viene aggiunta all'intera agenda dopo le chiamate per blocco e prima della chiamata di sola lettura finale.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.