LINUX.ORG.RU

Emacs: дата выполнения задачи = день выполнения задачи

 


1

3

Сап, лор. Подскажите начинающему emacs'еру, как осуществить встроенными инструментами, если это возможно, следующее. Допустим, есть schedule задача, назначенная на 20.10.2018. Сегодня 25.10.2018, я задуманное осуществил и хочу поменять статус задачи с TODO на DONE. В agenda меняю статус, делаю ребилд и вижу, что задача числится выполненной не в день изменения статуса (25.10.2018), а в день, на который schedule назначен (20.10.2018). Есть вариант, как можно заставить при смене статуса на DONE проставлять дату выполнения задачи, а не дату, назначенную в schedule изначально. Можно конечно дату начала schedule подогнать, когда хочешь сменить статус, но это как то не удобно.

Если я правильно понимаю то, что ты хочешь, то это вшитое поведение и специальных ручек, которыми можно покрутить это место, нет. По крайней мере, в Emacs 24 так. Это поведение вшито в код, поэтому тут только лиспить придется. Вот это место в org.el в функции org-todo:

(defun org-todo (&optional arg)

...

	      (when (and now-done-p org-log-done)
		;; It is now done, and it was not done before
		(org-add-planning-info 'closed (org-current-effective-time))
		(if (and (not dolog) (eq 'note org-log-done))
		    (org-add-log-setup 'done org-state this 'findpos 'note)))

...

Как видно, org-current-effective-time вставляется безусловно и жестко. Если я ничего не упустил, то лиспить свою функцию придется.

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 1)

Хотя я вот читаю еще раз твое сообщение, а ты хочешь обратного? Тогда вроде так и должно быть. Должна проставиться текущая дата. Сегодняшняя.

UPD. А, все, увидел, ты в Agenda делаешь. Сейчас гляну, что там.

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 1)

В общем, код я посмотрел но там тоже жестко. Функция org-agenda-todo в org-agenda.el. Если честно, то вот сейчас нет времени покопаться. но вот нашел быстрое решение. Смысла решения - пишем свою интерактивную функцию, которая вставит дату под курсором (то есть дату 20.10.2018). Попробуй пока.

https://emacs.stackexchange.com/questions/28892/how-to-mark-org-agenda-item-a...

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

Смысла решения - пишем свою интерактивную функцию, которая вставит дату под курсором (то есть дату 20.10.2018)

Спасибо, но это ровно противоположное тому, что мне надо) Еще раз. Что сейчас (все происходит в agenda):

Thursday   25 October 2018
main:       Sched.5x:  TODO Pw
t
Sunday   21 October 2018
main:       Scheduled:  DONE Pw
Задача начата 21-го, отмечаю выполненной 25-го, она меняет статус на выполнено 21-го. А мне надо:
Thursday   25 October 2018
main:       Sched.5x:  TODO Pw
t
Thursday   25 October 2018
main:       Scheduled:  DONE Pw
Задача начата 21-го, отмечена выполненной 25-го, должна значится в агенде выполненной 25-го.

brittx ()
Ответ на: комментарий от brittx

Все, теперь смог поглядеть. Я понял, что у тебя. У тебя в планировщике не показывается состояние CLOSED, а это надо попросить у org-mode специально. В кусочке исходного кода выше видно, что именно на 'closed вешается org-current-effective-time. Показ даты выполнения задачи включается переменной org-log-done в значение 'time. Вот соответствующий пункт документации: https://orgmode.org/manual/Closing-items.html

Не подходит?

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

Почти. В org файле появился статус CLOSED за правильное число, но мне он нужен в agenda, потому что я только через нее смотрю задачи. В agenda по прежнему DONE за число, когда был назначен schedule.

brittx ()
Ответ на: комментарий от brittx

В агенда тоже есть. Не знаю, почему у тебя так. Вот у меня тестовый файл. 12 окт поставил на старт, а сегодня закрыл. Показывается и там и там:

Friday     12 October 2018
  test:       Scheduled:  DONE [#B] Тест 2

...

Friday     26 October 2018
               8:00...... ----------------
  test:        8:42...... Closed:     DONE [#B] Тест 2

...
Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

Не знаю, может от версии зависит. У меня 26.1-2. Текущий конфиг:

(custom-set-variables
 ;; custom-set-variables was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(org-agenda-files
   (quote
    ("/home/brit/org/main.org")))
)
(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 )

(global-set-key "\C-ca" 'org-agenda)
(tool-bar-mode -1)
(set-default-font "Liberation Mono-11")
(global-display-line-numbers-mode)
(setq-default cursor-type 'hbar)
(setq-default truncate-lines t)
(setq org-log-done 'time)
Попробовал также как у тебя с приоритетами, но безрезультатно.

brittx ()
Ответ на: комментарий от brittx

Не знаю, может от версии зависит. У меня 26.1-2.

С этим сложно, так как у меня Emacs 24 из stable. Надо тогда хорошенько изучить, не появилась ли какая-то дополнительная опция именно для agenda, которая позволяет включать видимость Closed.

Zubok ★★★★★ ()
Ответ на: комментарий от brittx

Ну-ка, глянь, как у тебя установлена переменная org-agenda-log-mode-items. У меня значения по умолчанию: '(closed clock). То есть closed он показывает. Может, в Emacs 26 умолчание изменилось?

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok
Hide Org Agenda Log Mode Items:
[X] closed
[X] clock
[ ] state
    State : STANDARD.
   List of items that should be shown in agenda log mode. Hide
   This list may contain the following symbols:
   
     closed    Show entries that have been closed on that day.
     clock     Show entries that have received clocked time on that day.
     state     Show all logged state changes.
   Note that instead of changing this variable, you can also press ‘C-u l’ in
   the agenda to display all available LOG items temporarily.
Groups: Org Agenda Daily/Weekly
brittx ()
Ответ на: комментарий от brittx

А-а-а, ну понятно, у тебя отключен просто org-agenda-log-mode. Если режим включить, то увидишь. Включается кнопкой <l> (L) в буфере Agenda.

Zubok ★★★★★ ()
Ответ на: комментарий от brittx

Угу. Ну а там выше код (это я уже для справки), на который я ссылки дал, мне кажется неудачным. В org-mode есть хук, который вызывается после изменения состояния: org-after-todo-state-change-hook - в нем и можно поменять timestamp у записи, а не делать хаки.

Zubok ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.