Org-mode. Пакет org-habit-ng

Org-mode. Пакет org-habit-ng

2026-01-28 · 4 мин. для прочтения
blog computer-science

Org-mode. Пакет org-habit-ng.

Содержание

1 Общая информация

  • Репозиторий: https://codeberg.org/Trevoke/org-habit-ng
  • Расширяет стандартный org-mode за счёт введения собственного DSL.
  • Для меня наиболее интересна возможность задания количества повторений и время, после которого завершается работа привычки.

2 Другие пакеты

  • Другие пакеты тоже могут реализовать подобную функциональность.

2.1 org-repeat-by-cron

2.2 org-reschedule-by-rule

3 Шаблоны правил

  • RRULE — это стандарт для календарного повторения (RFC 5545).

3.1 Суточные и недельные графики

  • Простейшие закономерности повторяются через фиксированные интервалы.
  • FREQ задает базовую единицу измерения (день, неделя, месяц, год).
  • INTERVAL умножает его.
  • Фильтр BYDAY для выбора конкретных дней.
Что нужноПравило
Каждый деньFREQ=DAILY
Каждые 3 дняFREQ=DAILY;INTERVAL=3
Каждую неделюFREQ=WEEKLY
Каждые 2 неделиFREQ=WEEKLY;INTERVAL=2
Пн, Ср, ПтFREQ=WEEKLY;BYDAY=MO,WE,FR
Только по выходнымFREQ=WEEKLY;BYDAY=SA,SU

3.2 Ежемесячные модели

  • BYDAY с числовым префиксом означает «N-е вхождение» «Этот будний день месяца».
  • Отрицательные числа отсчитываются с конца.
Что нужноПравило
15-го числа каждого месяцаFREQ=MONTHLY;BYMONTHDAY=15
Последний день месяцаFREQ=MONTHLY;BYMONTHDAY=-1
2-я субботаFREQ=MONTHLY;BYDAY=2SA
В прошлую пятницуFREQ=MONTHLY;BYDAY=-1FR
Первый будний деньFREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=1

3.3 Годовые модели

Что нужноПравило
Каждый год 1 январяFREQ=YEARLY;BYMONTH=1;BYMONTHDAY=1
Последнее воскресенье декабряFREQ=YEARLY;BYMONTH=12;BYDAY=-1SU
День уплаты налогов (15 апреля)FREQ=YEARLY;BYMONTH=4;BYMONTHDAY=15

4 Гибкость в реальных условиях

4.1 Гибкие окна

  • Некоторые привычки не требуют строгого соблюдения графика. Например, “Поливать растения каждые 3 дня” — это действительно означает “примерно каждые 3 дня”:

    ​* TODO Water plants
    SCHEDULED: <2024-01-15 Mon>
    :PROPERTIES:
    :STYLE: habit
    :RECURRENCE: FREQ=DAILY;INTERVAL=3;X-FLEXIBILITY=1
    :END:
    
  • X-FLEXIBILITY=1 означает, что завершение на 1 день раньше или позже по-прежнему отображается как «Вовремя».

4.2 Повторение

  • По умолчанию следующее событие рассчитывается с момента завершения.
  • Но некоторые привычки следует придерживаться графика независимо от того, когда вы их завершите. их.
  • Прием лекарств по установленному графику, например:
    ​* TODO Take medication
    SCHEDULED: <2024-01-15 Mon>
    :PROPERTIES:
    :STYLE: habit
    :RECURRENCE: FREQ=DAILY;X-REPEAT-FROM=scheduled
    :END:
    
ЗначениеСмысл
completionДалее — с момента, когда вы отметите «ГОТОВО» (по умолчанию).
scheduledСледующая дата с запланированной даты
scheduled-futureКак и планировалось, но раньше никогда не было запланировано.

4.3 Индивидуальные периоды предупреждения

  • В случае привычек с длительными интервалами вам могут понадобиться более ранние предупреждения:

    ​* TODO Quarterly review
    SCHEDULED: <2024-01-15 Mon>
    :PROPERTIES:
    :STYLE: habit
    :RECURRENCE: FREQ=MONTHLY;INTERVAL=3;X-WARN=2w
    :END:
    
  • X-WARN=2w : предупреждение о привычке появится за 2 недели до запланированной даты.

4.4 Прекращение действия: Ограниченные привычки

  • Некоторые привычки не остаются навсегда.
  • Например, 30-дневный челлендж:
    ​* TODO 30-day challenge
    SCHEDULED: <2024-01-01 Mon>
    :PROPERTIES:
    :STYLE: habit
    :RECURRENCE: FREQ=DAILY;COUNT=30
    :END:
    
ПараметрЗначение
COUNT=NОстановиться после N событий
UNTIL=YYYYMMDDОстановиться после этой даты
  • Я это же делаю с помощью org-edna (но сложнее и не полностьб реализую данный функционал).

5 Использование мастера

  • Мастер для создания описания повторений:
M-x org-habit-ng-set-recurrence
  • Мастер настройки пошагово описывает каждый вариант и показывает предварительный просмотр перед сохранением.
  • Если заголовок уже содержит RECURRENCE свойство, которое вы можете изменить или очистить его.

6 Сводное описание

6.1 Полный набор компонентов RRULE

6.1.1 Частоты

ЧастотаЗначение
SECONDLYКаждые N секунд
MINUTELYКаждые N минут
HOURLYКаждые N часов
DAILYКаждые N дней
WEEKLYКаждые N недель
MONTHLYКаждые N месяцев
YEARLYКаждые N лет

6.1.2 Параметры

ПараметрЦенностиЗначение
INTERVALЧисло (по умолчанию 1)Повторять каждые N периодов
BYDAYПН, ВТ, СР, ЧТ, ПТ, СБ, ВСКонкретные дни недели
BYDAY2SA, -1FRN-й рабочий день (отрицательное число = от конца)
BYMONTHDAY1-31, -1 до -31День месяца (отрицательное число = от конца месяца)
BYMONTH1-12Конкретные месяцы
BYSETPOS1, -1 и т. д.Позиция в сете (первая, последняя)
COUNTЧислоОстановиться после N событий
UNTILГГГГММДДОстановить после истечения срока годности

6.1.3 Расширения org-habit-ng

РасширениеЦенностиЗначение
X-REPEAT-FROMзавершение, запланированное, запланированное на будущееОснова для следующего события
X-WARNNd, Nw, Nh (дни, недели, часы)Предупредительный период
X-FLEXIBILITYЧисло (дней)Льготный период вокруг даты платежа

6.2 Команды

КомандованиеОписание
org-habit-ng-modeВключение/отключение дополнительного режима
org-habit-ng-set-recurrenceИнтерактивный мастер для RRULE
Дмитрий Сергеевич Кулябов
Authors
Профессор кафедры теории вероятностей и кибербезопасности
Работаю профессором на кафедре теории вероятностей и кибербезопасности Российского университета дружбы народов им. Патриса Лумумбы. Научные интересы относятся к области теоретической физики и математического моделирования.