Masquer les éléments avec une certaine balise dans l'agenda en fonction de l'heure de la journée

8

Est-il possible de masquer des éléments avec une certaine balise après à une heure précise de la journée? Par exemple, j'aimerais que, après 17h et le week-end,: TRAVAIL: les éléments n'apparaissent pas dans l'agenda.

EDIT: Je traite des éléments planifiés et je compte sur la fonction org-agenda-list.

David Gagnon
la source
Oui, mais ce sera un peu lent si vous avez beaucoup de délais et / ou de prévu. Veuillez modifier votre message (ou ajouter un commentaire) pour spécifier si vous avez affaire à des délais ou planifiés, et si les deux, celui que vous souhaitez évaluer. Dans mon esprit, je pense à une coutume org-agenda-skip-function. En outre, s'il vous plaît préciser lequel des trois (3) principales fonctions que vous dépendrons - org-agenda-list, org-search-viewou org-tags-view.
Lawlist

Réponses:

2

Vous pouvez personnaliser le saut d'entrées spécifiques en org-agendautilisant une fonction de saut . Il s'agit d'une fonction (ou d'une forme lisp) qui sera évaluée à chaque titre et devrait renvoyer nil(pour ne pas sauter le titre) ou le point du titre suivant à considérer (qui est généralement le titre suivant, mais pourrait être, par exemple, le frère ou sœur suivant pour accélérer la recherche).

Dans ce cas, nous avons juste besoin d'une fonction pour sauter le titre si elle a une certaine balise (obtenez-en avec org-get-tags-at) et qu'elle (current-time)est après une certaine heure:

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

Cela ne tient pas compte du jour de la semaine, mais cette logique

Vous pouvez soit (setq (setq org-agenda-skip-function-global '(skip-tag-after "WORK" 17))ignorer ces titres globalement dans chaque agenda, soit le définir org-agenda-skip-functionlocalement dans un org-agenda-custom-commandpour affecter uniquement cet agenda.

erikstokes
la source
Que faire si j'ai plusieurs de ces balises: une pour le temps de travail, une autre pour les soirées 7 jours sur 7, etc.? Comment combiner le filtrage sur chacun d'eux?
Alexander Shcheblikin
Vous pouvez utiliser une forme lisp comme valeur de org-agenda-skip-functionpar exemple en la définissant sur(or (skip-tags-after "WORK" 17) (skip-tags-after "HOME" 9))
erikstokes
3

Une solution de contournement très simple consisterait à créer une ou des vues d'agenda spéciales que vous n'utilisez que le soir et le week-end.

Pour donner un exemple très simple, vous pouvez personnaliser org-agenda-custom-commandsen ajoutant quelque chose comme ("x" "No Work" tags-todo "-work" nil). Les soirs et les week-ends, vous pouvez afficher votre vue d'ensemble de l'agenda avec C-c a x.

Brian Z
la source
Ceci est ma configuration actuelle et cela fonctionne, mais je considérais une alternative.
David Gagnon
2
org-agenda-custom-commandsvous permet également de définir des fonctions personnalisées ... Il devrait certainement être possible de faire ce que vous voulez de cette façon (un simple if), mais je ne sais pas assez bien pour vous montrer exactement comment.
Brian Z