Как я могу отметить привычки Org, как это было сделано в прошлом

Я регулярно отмечаю привычки как СОВЕРШЕН на следующий день после того, как была сделана работа. Модуль "Привычки" автоматически обновляет кучу дат в метаданных, когда я это делаю, но дата всегда сегодня. Итак, мне нужно вручную отредактировать состояния SCHEDULED, LOGBOOK и LAST_REPEAT.

Есть ли способ отметить привычку как DONE на один день в прошлом? Поэтому вместо того, чтобы делать C-c C-t d (у меня есть "d", настроенный как "DONE" ), я мог бы получить приглашение, в котором меня спрашивали о дате.

Ответ 1

Я тоже хотел сделать это в течение некоторого времени, и ваш вопрос вдохновил меня наконец разобраться.

Существует функция, называемая "org-todo-вчера". По умолчанию он не привязан к какому-либо ключу, но вы всегда можете вызвать его с помощью M-x org-todo-yesterday (или сопоставить его, если вы его используете). Для меня он ломается, потому что он вызывает "третью", которая не является определенной функцией в моей установке.

Для более общей функции, которая подсказывает нам дату и маркирует все, что было сделано в то время, мы можем добавить эту функцию (вдохновленную org-todo-вчера) в наш initac файл emacs. Он будет действовать так, как будто вы закончили работу в 23:59 на заданную дату, что, надеюсь, будет достаточно хорошим.

(defun dk/org-todo-custom-date (&optional arg)
  "Like org-todo-yesterday, but prompt the user for a date. The time
of change will be 23:59 on that day"
  (interactive "P")
  (let* ((hour (nth 2 (decode-time
               (org-current-time))))
     (daysback (- (date-to-day (current-time-string)) (org-time-string-to-absolute (org-read-date))))
     (org-extend-today-until (+ 1 (* 24 (- daysback 1)) hour))
     (org-use-effective-time t)) ; use the adjusted timestamp for logging
    (if (eq major-mode 'org-agenda-mode)
    (org-agenda-todo arg)
      (org-todo arg))))