Sembunyikan item dengan tag tertentu dalam agenda berdasarkan waktu hari

8

Apakah mungkin menyembunyikan item dengan tag tertentu setelah pada waktu tertentu hari itu? Misalnya, saya suka itu setelah pukul 17:00 dan pada akhir pekan,: BEKERJA: item tidak muncul dalam agenda.

EDIT: Saya berurusan dengan item yang dijadwalkan dan mengandalkan fungsi org-agenda-daftar.

David Gagnon
sumber
Ya, tetapi akan sedikit lambat jika Anda memiliki banyak tenggat waktu dan / atau dijadwalkan. Harap edit posting Anda (atau tambahkan komentar) untuk menentukan apakah Anda berurusan dengan tenggat waktu atau dijadwalkan, dan jika keduanya, mana yang ingin Anda evaluasi. Dalam benak saya, saya memikirkan suatu kebiasaan org-agenda-skip-function. Juga, harap sebutkan yang mana dari tiga (3) fungsi utama Anda mengandalkan - org-agenda-list, org-search-view, atau org-tags-view.
hukum

Jawaban:

2

Anda dapat menyesuaikan melewatkan entri tertentu org-agendadengan menggunakan fungsi lewati . Ini adalah fungsi (atau bentuk lisp) yang akan dievaluasi pada setiap judul dan harus mengembalikan nil(untuk tidak melewatkan judul) atau titik judul berikutnya untuk dipertimbangkan (yang biasanya merupakan judul berikutnya, tetapi bisa juga, misalnya saudara berikutnya untuk mempercepat pencarian).

Dalam hal ini, kita hanya perlu fungsi untuk melewati informasi utama jika memiliki tag tertentu (dapatkan dengan org-get-tags-at) dan (current-time)setelah jam tertentu:

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

Ini tidak mempertimbangkan hari kerja, tetapi itu adalah logika

Anda dapat (setq (setq org-agenda-skip-function-global '(skip-tag-after "WORK" 17))melewati tajuk utama secara global di setiap agenda, atau mengaturnya diatur org-agenda-skip-functionsecara lokal di dalam org-agenda-custom-commanduntuk memengaruhi hanya agenda itu.

erikstokes
sumber
Bagaimana jika saya memiliki beberapa tag: satu untuk waktu kerja, yang lain untuk malam hari 7 hari seminggu, dll? Bagaimana cara menggabungkan penyaringan pada semuanya?
Alexander Shcheblikin
Anda dapat menggunakan formulir lisp sebagai nilai org-agenda-skip-functiondengan misalnya menyetelnya ke(or (skip-tags-after "WORK" 17) (skip-tags-after "HOME" 9))
erikstokes
3

Solusi yang sangat sederhana adalah membuat tampilan agenda khusus (atau tampilan) yang hanya Anda gunakan di malam hari dan akhir pekan.

Untuk memberikan contoh yang sangat sederhana, Anda dapat menyesuaikan org-agenda-custom-commandsdengan menambahkan sesuatu seperti ("x" "No Work" tags-todo "-work" nil). Kemudian pada malam hari dan akhir pekan Anda dapat menarik keseluruhan tampilan agenda Anda C-c a x.

Brian Z
sumber
Ini adalah pengaturan saya saat ini dan berfungsi tetapi saya sedang mempertimbangkan alternatif.
David Gagnon
2
org-agenda-custom-commandsjuga memungkinkan Anda untuk mengatur fungsi kustom ... Pasti mungkin untuk melakukan apa yang Anda inginkan (sederhana if), tapi saya tidak tahu cukup baik untuk menunjukkan kepada Anda bagaimana tepatnya.
Brian Z