Написать и вызвать функцию из повестки дня (режим орг)

(Я не знаю шуток, поэтому я подозреваю, что это действительно просто.)

Я хочу написать функцию для упрощения моего режима org и настройки GTD.

Я основал свою настройку режима org на записи здесь: http://doc.norang.ca/org-mode.html

Я хочу использовать настройку "NEXT" (см. Ниже) для нескольких тегов - я могу просто вырезать и вставлять один и тот же код снова и снова, но было бы намного чище написать функцию, вместо того чтобы иметь это:

            (tags-todo "-WAITING-CANCELLED/!NEXT"
                       ((org-agenda-overriding-header "Next Tasks")
                        (org-agenda-skip-function 'bh/skip-projects-and-habits-and-single-tasks)
                        (org-agenda-todo-ignore-scheduled 'future)
                        (org-agenda-todo-ignore-deadlines 'future)
                        (org-tags-match-list-sublevels t)
                        (org-agenda-sorting-strategy
                         '(todo-state-down effort-up category-keep))))

Я бы предпочел что-то вроде:

            (MyFunction "@work")
            (MyFunction "@computer")

Где аргумент функции меняет фильтрацию в приведенном выше блоке кода на что-то вроде:

            (tags-todo "-WAITING-CANCELLED+<XXX>/!NEXT"

т.е.

            (tags-todo "-WAITING-CANCELLED+@work/!NEXT"

Может ли кто-нибудь помочь, указав мне правильное направление?

1 ответ

Решение

Следующее должно сделать трюк (он также включает в себя переменную, чтобы проверить, следует ли использовать + или же - перед тегом, по умолчанию -).

(defun zin/agenda-test (tag &optional signp)
  "Simplify agenda coding, only require TAG to create new block.

SIGNP determines whether to use `+' or `-' when adding the tag.
Defaulting to `-'."
  (let ((sign (if signp "+" "-")))
    `(tags-todo ,(format "-WAITING-CANCELLED%s%s/!NEXT" sign tag)
        ((org-agenda-overriding-header "Next Tasks")
         (org-agenda-skip-function 'bh/skip-projects-and-habits-and-single-tasks)
         (org-agenda-todo-ignore-scheduled 'future)
         (org-agenda-todo-ignore-deadlines 'future)
         (org-tags-match-list-sublevels t)
         (org-agenda-sorting-strategy
          '(todo-state-down effort-up category-keep))))))

(setq org-agenda-custom-commands `(("t" "Test"
                                (,(zin/agenda-test "@tag")
                                 ,(zin/agenda-test "@test" '+)))))

Вы должны убедиться, что org-agenda-custom-commands использует синтаксис обратной цитаты (`) вместо (quote ...)иначе команды не будут расширяться должным образом.

Другие вопросы по тегам