Re: How to mark task as done at specified (past) time?

2020-07-08 Thread Kyle Meyer
Tim Landscheidt writes:

> I have an icky feeling about cl-letfing current-time because
> Murphy might cause a timer to fire in just that time frame
> and I have no idea what current-time is for that timer; so
> if future org-mode releases would provide a cleaner API I
> would very much appreciate that :-).

Murphy would need to do something pretty invasive to get the timer to
execute in that scope, I think.  (Not relevant for this context, but
threads don't play nicely with cl-letf; if you cl-letf bind a function
definition in one thread and then yield execution to another, the second
thread can see the cl-letf binding.)

Anyway, I'd be glad to see API proposals (backward-compatibility
concerns aside).



Re: How to mark task as done at specified (past) time?

2020-07-08 Thread Tim Landscheidt
Kyle Meyer  wrote a long time ago:

> […]

>> Do I have to cl-flet org-current-time or something similar?

> Something along those lines would probably be the most straightforward.
> Light testing with the command below suggests overriding current-time is
> sufficient:

> (defun my-org-todo-time-machine ()
>   (interactive)
>   (cl-letf (((symbol-function 'current-time)
>  (lambda ()
>(apply #'encode-time (org-parse-time-string
>  "2019-11-27 Mi 16:44")
> (call-interactively #'org-todo)))

I finally got around to this and ended up with an entry in
gnus-select-article-hook à la:

| (lambda nil
|   (if
|   (and
|(string= gnus-newsgroup-name "mail.only.this.group")
|(string-match "^Regular expression that matches subject$"
|  (gnus-summary-article-subject)))
|   (let
|   ((article-time
| (gnus-date-get-time
|  (mail-header-date
|   (gnus-summary-article-header)
| (cl-letf
| (((symbol-function 'current-time)
|   (lambda nil article-time)))
|   (find-file "/path/to/file.org")
|   (goto-char
|(org-find-entry-with-id "TASK-ID"))
|   (org-todo 'done)

I have an icky feeling about cl-letfing current-time because
Murphy might cause a timer to fire in just that time frame
and I have no idea what current-time is for that timer; so
if future org-mode releases would provide a cleaner API I
would very much appreciate that :-).

Thanks,
Tim



Re: How to mark task as done at specified (past) time?

2019-12-11 Thread Kyle Meyer
Tim Landscheidt  writes:
[...]
> I want Gnus to mark the task as done /at the time when the mail was
> sent/, i. e. in:
> |- State "DONE"   from "TODO"   [2019-11-27 Mi 16:44]
>
> I want "2019-11-27 Mi 16:44" not to be the current time, but
> some other (past) time.
>
> How can I mark a task as done at a specified time?  Looking
> at org-add-planning-info, there seems to be a mechanism to
> pass a timestamp, but it does not seem to be exposed at
> higher levels (?).

Yes, as far as I can see, org-todo uses the TIME argument of
org-add-planning-info for the org-extend-today-until feature, but
there's not a way for the caller to directly specify the timestamp.

> Do I have to cl-flet org-current-time or something similar?

Something along those lines would probably be the most straightforward.
Light testing with the command below suggests overriding current-time is
sufficient:

(defun my-org-todo-time-machine ()
  (interactive)
  (cl-letf (((symbol-function 'current-time)
 (lambda ()
   (apply #'encode-time (org-parse-time-string
 "2019-11-27 Mi 16:44")
(call-interactively #'org-todo)))



How to mark task as done at specified (past) time?

2019-11-28 Thread Tim Landscheidt
Hi,

with Emacs 26.2/org-mode 9.1.9, I have a repeating task that
I close with a helper function:

| (defun tl-entry-done ()
|   (interactive)
|   (find-file "/path/to/file.org")
|   (goto-char (org-find-entry-with-id "ENTRY-ID"))
|   (org-todo 'done))

Every time I do this task, I get an acknowledging mail, so
instead of manually closing this task (and forgetting to do
that, or delaying it for some time) I want Gnus to mark the
task as done /at the time when the mail was sent/, i. e. in:

|- State "DONE"   from "TODO"   [2019-11-27 Mi 16:44]

I want "2019-11-27 Mi 16:44" not to be the current time, but
some other (past) time.

How can I mark a task as done at a specified time?  Looking
at org-add-planning-info, there seems to be a mechanism to
pass a timestamp, but it does not seem to be exposed at
higher levels (?).

Do I have to cl-flet org-current-time or something similar?

Tim