Искренне не понимаю, почему я пользуюсь Емаксом вот уже 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-скриптов для работы с ними — они считают примерные расходы по деньгам/газу, организуют минимальную логистику и т.д. Но об этом как-нибудь в другой раз.