Verstecken Sie Elemente mit einem bestimmten Tag in der Tagesordnung basierend auf der Tageszeit

8

Ist es möglich, Elemente mit einem bestimmten Tag nach einer bestimmten Tageszeit auszublenden? Zum Beispiel möchte ich das nach 17 Uhr und am Wochenende: ARBEIT: Elemente erscheinen nicht auf der Tagesordnung.

BEARBEITEN: Ich beschäftige mich mit geplanten Elementen und verlasse mich auf die Funktion der Organisationsagenda-Liste.

David Gagnon
quelle
Ja, aber es wird etwas langsam, wenn Sie viele Fristen und / oder Termine haben. Bitte bearbeiten Sie Ihren Beitrag (oder fügen Sie einen Kommentar hinzu), um anzugeben, ob Sie sich mit Fristen oder geplanten Terminen befassen und wenn beide, welchen Sie bewerten möchten. In meinen Gedanken denke ich an einen Brauch org-agenda-skip-function. Auch geben Sie bitte , welche der drei (3) Hauptfunktionen , die Sie verlassen sich auf - org-agenda-list, org-search-viewoder org-tags-view.
Lawlist

Antworten:

2

Sie können das Überspringen bestimmter Einträge org-agendamithilfe einer Überspringfunktion anpassen . Dies ist eine Funktion (oder Lisp-Form), die bei jeder Überschrift ausgewertet wird und zurückgeben sollte nil(um die Überschrift nicht zu überspringen) oder den Punkt der nächsten zu berücksichtigenden Überschrift (der normalerweise die nächste Überschrift ist, aber beispielsweise die sein könnte) nächstes Geschwister, um die Suche zu beschleunigen).

In diesem Fall benötigen wir nur eine Funktion, um die Überschrift zu überspringen, wenn sie ein bestimmtes Tag hat (diese mit abrufen org-get-tags-at) und das (current-time)nach einer bestimmten Stunde ist:

(defun skip-tag-after (tag hour)
  (let* ((next-headline (save-excursion
                          (or (outline-next-heading) (point-max))))
        (current-headline (or (and (org-at-heading-p)
                                   (point))
                              (save-excursion (org-back-to-heading))))
        ;; (now (decode-time (current-time)))
        (target (decode-time (current-time)))
        (day (nth 6 target))
        )
    (setcar (last target 7) hour)
    (setcar (last target 8) 0)
    (if (and (member tag (org-get-tags-at current-headline))
             (or (eq day 0)
                 (eq day 6)
                 (time-less-p (apply #'encode-time target) (current-time))))
            next-headline
            nil)))

Dies berücksichtigt nicht den Wochentag, sondern diese Logik

Sie können (setq (setq org-agenda-skip-function-global '(skip-tag-after "WORK" 17))solche Überschriften entweder global in jeder Agenda überspringen oder org-agenda-skip-functionlokal in a festlegen org-agenda-custom-command, um nur diese Agenda zu beeinflussen.

erikstokes
quelle
Was ist, wenn ich mehrere solcher Tags habe: eines für die Arbeitszeit, eines für Abende an 7 Tagen in der Woche usw.? Wie kombiniere ich die Filterung für alle?
Alexander Shcheblikin
Sie können ein Lisp-Formular als Wert verwenden, org-agenda-skip-functionindem Sie es beispielsweise auf(or (skip-tags-after "WORK" 17) (skip-tags-after "HOME" 9))
erikstokes
3

Eine sehr einfache Problemumgehung wäre, eine spezielle Agenda-Ansicht (oder Ansichten) zu erstellen, die Sie nur an Abenden und Wochenenden verwenden.

Um ein sehr einfaches Beispiel zu geben, können Sie es anpassen, org-agenda-custom-commandsindem Sie etwas wie hinzufügen ("x" "No Work" tags-todo "-work" nil). Abends und am Wochenende können Sie dann Ihre Gesamtagenda mit aufrufen C-c a x.

Brian Z.
quelle
Dies ist mein aktuelles Setup und es funktioniert, aber ich habe über eine Alternative nachgedacht.
David Gagnon
2
org-agenda-custom-commandsSie können auch benutzerdefinierte Funktionen festlegen ... Es sollte auf jeden Fall möglich sein, auf diese Weise zu tun, was Sie wollen (einfach if), aber ich weiß nicht gut genug, um Ihnen zu zeigen, wie genau.
Brian Z