Ocultar elementos con una etiqueta determinada en la agenda según la hora del día

8

¿Es posible ocultar elementos con una etiqueta determinada después de una hora específica del día? Por ejemplo, me gustaría eso después de las 5 p.m. y los fines de semana,: TRABAJO: los elementos no aparecen en la agenda.

EDITAR: Estoy tratando con elementos programados y confío en la función org-agenda-list.

David Gagnon
fuente
Sí, pero será un poco lento si tiene muchos plazos y / o está programado. Edite su publicación (o agregue un comentario) para especificar si está tratando con fechas límite o programadas, y si ambas, cuál desea evaluar. En mi mente, estoy pensando en una costumbre org-agenda-skip-function. También, por favor especificar cuál de las tres (3) funciones principales que usted está confiando en - org-agenda-list, org-search-viewo org-tags-view.
abogados el

Respuestas:

2

Puede personalizar la omisión de entradas específicas org-agendamediante el uso de una función de omisión . Esta es una función (o forma de ceceo) que se evaluará en cada título y debe regresar nil(para no omitir el título) o el punto del siguiente título a considerar (que normalmente es el próximo título, pero podría ser, por ejemplo, el siguiente hermano para acelerar la búsqueda).

En este caso, solo necesitamos una función para omitir el título si tiene una etiqueta determinada (obtener con org-get-tags-at) y (current-time)es después de una hora determinada:

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

Esto no considera el día de la semana, pero esa lógica

Puede (setq (setq org-agenda-skip-function-global '(skip-tag-after "WORK" 17))omitir dichos titulares a nivel mundial en cada agenda o configurarlo org-agenda-skip-functionlocalmente dentro de a org-agenda-custom-commandpara afectar solo esa agenda.

erikstokes
fuente
¿Qué sucede si tengo varias de estas etiquetas: una es para el tiempo de trabajo, otra es para las tardes los 7 días de la semana, etc.? ¿Cómo combino el filtrado en todos ellos?
Alexander Shcheblikin
Puede usar un formulario lisp como valor de, org-agenda-skip-functionpor ejemplo, configurándolo en(or (skip-tags-after "WORK" 17) (skip-tags-after "HOME" 9))
erikstokes
3

Una solución alternativa muy simple sería hacer una vista (o vistas) de agenda especial que solo use en las tardes y fines de semana.

Para dar un ejemplo muy simple, puede personalizar org-agenda-custom-commandsagregando algo como ("x" "No Work" tags-todo "-work" nil). Luego, en las noches y fines de semana, puede acceder a la vista general de su agenda C-c a x.

Brian Z
fuente
Esta es mi configuración actual y funciona, pero estaba considerando una alternativa.
David Gagnon
2
org-agenda-custom-commandstambién le permite establecer funciones personalizadas ... Definitivamente debería ser posible hacer lo que quiera de esa manera (una simple if), pero no sé elisp lo suficientemente bien como para mostrarle cómo exactamente.
Brian Z