LINUX.ORG.RU

Ты точно уверен, что переменная называется org-todo-keywords? Там в коде используется org-todo-keywords-1

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

Да, точно. В документации к org-todo и org-todo-keywords написано, что первая перебирает то, что указано во второй. Что делает org-todo-keywords-1 я затрудняюсь понять т.к. к ней вообще никакой документации нет...

arte-at-marte
() автор топика
Ответ на: комментарий от arte-at-marte

Для глубокой кастомизации проще всего читать сорцы. Документация зачастую неполная, а читая сорцы можно найти самое красивое решение.

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

в моем понимании красивое решение и emacs lisp в любом случае не совместимы ^^

но по идее это должно было быть самое красивое и правильное решение в рамках emacs lisp... :(

arte-at-marte
() автор топика

В документации не написано, что ее можно изменять динамически. Вот ты попробовал и не получилось. В этом Emacs Lisp не виноват, так написан org-mode. Эта переменная, скорее всего, читается один раз при инициализации режима, переписывается в каком-то виде в какую-то внутреннюю переменную, которая в org-todo используется в дальнейшем. Я в код не смотрел, но, скорее всего, именно так.

Zubok ★★★★★
()

Вот так попробуй, но это не динамически, но переопределит список keyword. То есть придется восстанавливать потом старые значения.

(let ((org-todo-keywords '((sequence "WAITING" "TODO")))) 
  (org-mode-restart) 
  (org-mode arg))
org-mode-restart is an interactive compiled Lisp function.

(org-mode-restart)

Restart Org-mode, to scan again for special lines.
Also updates the keyword regular expressions.
Zubok ★★★★★
()
Ответ на: комментарий от Zubok

задача казалась тривиальной: чтобы статус задачи с «WAITING» всегда переключался на «TODO»... ~~"

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

* DONE Сделать
  CLOCK: [2012-12-03 Пн. 21:26]
  CLOSED: [2012-12-04 Вт. 21:27]
  SPENDED: 00:01

arte-at-marte
() автор топика
Ответ на: комментарий от Zubok

и еще одна деталь, я потихоньку переписываю стандартные функции clojure на emacs lisp. Не подскажете, что на emacs lisp есть для отложеных вычислений и распараллеливания?

arte-at-marte
() автор топика
Ответ на: комментарий от arte-at-marte

и еще для модификации синтаксиса, ато сам имакс, насколько я знаю этого не позволяет?

arte-at-marte
() автор топика
Ответ на: комментарий от arte-at-marte

задача казалась тривиальной: чтобы статус задачи с «WAITING» всегда переключался на «TODO»... ~~"

Не вижу сложностей, но только я не понимаю одного: как ты ставишь статус «WAITING»? Обычным C-c C-t? А что происходить должно, когда ты потом нажимаешь еще раз C-c C-t? А какие еще состояния у тебя есть? Как выглядит алгоритм работы?

Другими словами, зачем динамически подмахивать? Разве нельзя просто список '(sequence «state1» «state2» .... «WAITING» «DONE») сделать? Тогда у тебя будет после «WAITING» твой «DONE»

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

Рабочий алгоритм пока типо такого:

(setq org-todo-keywords '(; прим: sequence - ключевое слово ; C-u C-c C-t включает второй список (sequence «TODO» «WAITING» «|» «DONE») (sequence «QUOTE» «QUOTED» «|» «APPROVED» «EXPIRED» «REJECTED» )))

(define-key org-mode-map (kbd «C-c C-t») (lambda (&optional arg) (interactive) (let ((state (org-get-todo-state))) (if (not state) (org-todo arg) (let ((s (substring-no-properties state))) (if (string= s «WAITING») (let ((org-todo-keywords-1 '(«TODO»))) (org-todo arg)) (org-todo arg)))))))

т.е. я динамически переопределяю org-todo-keywords-1, как советовал provaton. Токо оно еще не совсем работает: рекурсивн опереключает WAITING и TODO... ~~"

arte-at-marte
() автор топика
Ответ на: комментарий от arte-at-marte

Объясни, плиз, на словах, что ты хочешь сделать. Я вообще не понимаю. Как должно быть? Ты же пишешь выше, что хочешь после WAITING чтобы был TODO. Почему это не подходит:

(setq org-todo-keywords 
      '((sequence "WAITING" "TODO" "|" "DONE") 
	(sequence "QUOTE" "QUOTED" "|" "APPROVED" "EXPIRED" "REJECTED" )))

После WAITING будет TODO.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от arte-at-marte

т.е. я динамически переопределяю org-todo-keywords-1

Ну и вдогонку. Идея лезть во внутренние переменные - это от безнадеги. Если тебе хочется манипулировать каким-то хитрым способом с TODO, то пользуйся штатными методами - через хуки. Есть несколько хуков. Например, есть org-trigger-hook. Ты можешь словить событие переключения статуса задачи и сделать org-todo на любой другой статус в зависимости от каких-то условий. Например, так:

(setq org-todo-keywords '((sequence "QUOTE" "TODO" "DONE" "WAITING")))

(defun org-todo-todo-after-waiting (arg)
  (if (and (eq (plist-get arg :type) 'todo-state-change)
	   (string= (plist-get arg :from) "WAITING"))
      (org-todo "TODO")))

(add-hook 'org-trigger-hook 'org-todo-todo-after-waiting)

Но этот код тоже будет циклить между TODO, DONE и WAITING, на QUOTE никогда не попадет, но это ничего удивительного, так как ты сам такую логику странную закладываешь. Твое желание, как я и написал выше, исполняется обычным методом без всяких хаков.

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

задача казалась тривиальной: чтобы статус задачи с «WAITING» всегда переключался на «TODO»

Не благодари :)

(org-map-entries '(org-todo 'todo) "/WAITING")

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

на словах, что ты хочешь сделать

iVS правильно ответил:

(org-map-entries '(org-todo 'todo) «/WAITING»)

вот именно это я и хотел сделать! ^^

arte-at-marte
() автор топика
Ответ на: комментарий от arte-at-marte

вот именно это я и хотел сделать! ^^

Как это словами описать? Потому что то, что ты описал, совершенно другое. И тот код, который ты попытался написать, тоже делает совсем не это. И я до сих пор не понимаю, что ты хотел.

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