Организация мероприятий в Org Mode

Искрен­не не по­ни­маю, по­че­му я поль­зу­юсь Емак­сом вот уже 17 лет, а Org Mode вклю­чил в свою жизнь толь­ко не­дав­но (по­то­му что до не­дав­них пор его под­дер­жка на Android бы­ла очень груст­ной?)

Как у лю­бо­го за­мо­ро­чен­но­го outdoor-ак­ти­вис­та, у ме­ня есть па­чка раз­лич­ных ша­блон­ных за­пи­сей для ор­га­ни­за­ции оче­ред­ной по­езд­ки. Сей­час с по­мощью не­боль­шо­го ко­ли­чест­ва ко­да сде­лал так, что­бы пла­ни­ро­ва­ние оче­ред­ной экс­пе­ди­ции за­ни­ма­ло букваль­но ми­ну­ту. Речь им­ен­но о пла­ни­ро­ва­нии под­го­то­ви­тель­ных дел: ре­монт сна­ря­же­ния, за­куп­ки, стра­хов­ки, транспорт и т.д.

Шаб­лон экс­пе­ди­ции имеет при­мер­но та­кой вид:

#+CATEGORY: %category%

* %event%
  :PROPERTIES:
  :CREATED:  %t
  :END:

** Подготовка дома
*** TODO Заказать литиевые батарейки
   SCHEDULED: %date_5_months%
*** TODO Купить билеты
   SCHEDULED: %date_5_months%

... и ещё сотня пунктов ...

Преж­де мне при­хо­ди­лось вруч­ную рас­став­лять да­ты в план. Сей­час этот ша­блон об­ра­ба­ты­ва­ет­ся та­ким ку­соч­ком ко­да:

(require 's)

;; Генератор шаблона
(defun sport/expedition-template ()
  (interactive)
  (let* ((event (org-completing-read-no-i "Название экспедиции: " nil))
         (category (org-completing-read-no-i "Категория в org: " nil))
         (date-input (org-read-date nil t nil "Начало экспедиции: "))
         (date-fmt (car org-time-stamp-formats))
         (date-5-months (format-time-string date-fmt (time-subtract date-input (seconds-to-time (* 86400 30 5)))))
         (date-1-month (format-time-string date-fmt (time-subtract date-input (seconds-to-time (* 86400 30)))))
         (date-2-weeks (format-time-string date-fmt (time-subtract date-input (seconds-to-time (* 86400 7 2)))))
         (date-1-week (format-time-string date-fmt (time-subtract date-input (seconds-to-time (* 86400 7)))))
         (date-start (format-time-string date-fmt date-input))
         (src-tpl (with-temp-buffer
                    (insert-file-contents "~/org/personal/sport/организация-экспедиции.org.tpl")
                    (buffer-string)))
         (tpl
          (s-replace
           "%event%" event
           (s-replace
            "%category%" category
            (s-replace
             "%date_5_months%" date-5-months
             (s-replace
              "%date_1_month%" date-1-month
              (s-replace
               "%date_2_weeks%" date-2-weeks
               (s-replace
                "%date_1_week%" date-1-week
                (s-replace "%date_start%" date-start src-tpl)))))))))
    tpl))

;; Подключение генератора
(custom-set-variables
  '(org-capture-templates
    (quote
     (("e" "Экспедиция/мероприятие" plain
       (file (lambda () (read-file-name "Как назвать файл экспы: " "~/org/personal/sport/")))
       (function sport/expedition-template))))))

Теперь до­ста­точ­но на­жать C-c c e, вбить на­зва­ние экс­пе­ди­ции, ка­те­го­рию (для по­ряд­ка в org-agenda), имя фа­йла и вы­брать да­ту на­ча­ла экс­пы. Всё, план со­став­лен! Даль­ше мне ос­та­ет­ся его при не­об­хо­ди­мос­ти под­ре­дак­ти­ро­вать и прос­то ему сле­до­вать. Пре­бы­ваю в бур­ном во­стор­ге!

Внут­ри org-фа­йла ша­бло­на па­чка таб­ли­чек и Perl-скрип­тов для ра­бо­ты с ни­ми — они счи­та­ют при­мер­ные рас­хо­ды по день­гам/га­зу, ор­га­ни­зу­ют ми­ни­маль­ную ло­гис­ти­ку и т.д. Но об этом как-ни­будь в дру­гой раз.