Ocultar itens com uma determinada tag na agenda com base na hora do dia

8

É possível ocultar itens com uma determinada tag após uma hora específica do dia? Por exemplo, eu gostaria que depois das 17h e nos finais de semana:: TRABALHO: os itens não aparecem na agenda.

EDIT: Estou lidando com itens agendados e confiando na função org-agenda-list.

David Gagnon
fonte
Sim, mas será um pouco lento se você tiver muitos prazos e / ou agendados. Edite sua postagem (ou adicione um comentário) para especificar se você está lidando com prazos ou agendados, e se ambos, qual deles você deseja avaliar. Na minha cabeça, estou pensando em um costume org-agenda-skip-function. Além disso, por favor, especificar qual dos três (3) principais funções você está confiando em cima - org-agenda-list, org-search-viewou org-tags-view.
lawlist

Respostas:

2

Você pode personalizar pular entradas específicas org-agendausando uma função pular . Essa é uma função (ou forma de lisp) que será avaliada em cada título e deve retornar nil(para não ignorar o título) ou o ponto do próximo título a ser considerado (que normalmente é o próximo título, mas pode ser, por exemplo, o próximo irmão para acelerar a pesquisa).

Nesse caso, precisamos apenas de uma função para pular o título, se ele tiver uma determinada tag (obtenha-a org-get-tags-at) e o (current-time)prazo for após uma certa hora:

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

Isso não considera o dia da semana, mas essa lógica

Você pode (setq (setq org-agenda-skip-function-global '(skip-tag-after "WORK" 17))pular essas manchetes globalmente em todas as agendas ou defini-las org-agenda-skip-functionlocalmente dentro de uma org-agenda-custom-commandpara afetar apenas essa agenda.

erikstokes
fonte
E se eu tiver várias dessas tags: uma é para o horário de trabalho, outra é para as noites 7 dias por semana, etc? Como eu combino a filtragem em todos eles?
Alexander Shcheblikin 11/11
Você pode usar um formulário lisp como o valor de, org-agenda-skip-functionpor exemplo, configurando-o para(or (skip-tags-after "WORK" 17) (skip-tags-after "HOME" 9))
erikstokes 11/11/17
3

Uma solução muito simples seria criar uma visão (ou pontos de vista) especial da agenda que você usa apenas à noite e nos fins de semana.

Para dar um exemplo muito simples, você pode personalizar org-agenda-custom-commandsadicionando algo como ("x" "No Work" tags-todo "-work" nil). Depois, à noite e nos fins de semana, você pode exibir sua agenda geral C-c a x.

Brian Z
fonte
Esta é a minha configuração atual e funciona, mas eu estava pensando em uma alternativa.
David Gagnon
2
org-agenda-custom-commandstambém permite que você defina funções personalizadas ... Definitivamente, deve ser possível fazer o que você deseja (simples if), mas eu não sei o elisp o suficiente para mostrar exatamente como.
Brian Z