emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Kyle Meyer <kyle@kyleam.com>
To: Allen Li <darkfeline@felesatra.moe>
Cc: emacs-orgmode@gnu.org
Subject: Re: [PATCH] Query when exiting with running clock
Date: Wed, 03 Feb 2021 00:45:33 -0500	[thread overview]
Message-ID: <878s85ya9u.fsf@kyleam.com> (raw)
In-Reply-To: <80o8hu356e.fsf@felesatra.moe>

Allen Li writes:

> This is a patch adding a query function when exiting Emacs, warning the
> user if there is a running clock.  This is useful for preventing the
> user from accidentally leaving dangling clocks.  I have had success
> using a modified personal version of this code.

Thanks.  I'd find this useful as well.

> My personal version instead prompts the user to clock out and save the
> buffer.  I didn't use it for the patch because it seems a little hacky
> to me; e.g., kill-emacs-query-functions doesn't mention whether
> functions can have side effects, and the UI is inconsistent with
> save-buffers-kill-emacs.  The code for my personal version:

Fwiw that's what Emacs's lisp/calendar/timeclock.el does:

  (defun timeclock-query-out ()
    "Ask the user whether to clock out.
  This is a useful function for adding to `kill-emacs-query-functions'."
    (and (equal (car timeclock-last-event) "i")
         (y-or-n-p "You're currently clocking time, clock out? ")
         (timeclock-out))
    ;; Unconditionally return t for `kill-emacs-query-functions'.
    t)

> Subject: [PATCH 1/2] org-clock: Replace org-clocking-buffer with
>  org-clock-is-active
>
> org-clocking-buffer and org-clock-is-active have the same definition.
> org-clocking-buffer is defined in org-clock.el while
> org-clock-is-active is defined in org.el.  org-clock.el requires
> org.el.
>
> org-clocking-buffer is kept as an alias to preserve backward
> compatibility with any user code.

Dropping the duplicate definitions using an alias sounds good, though as
I mention below I'd prefer the spots that are specifically concerned
with a buffer to keep using the org-clocking-buffer name.

> * lisp/org-clock.el (org-clocking-buffer): Changed to alias.
> (org-clocking-p): Changed reference to org-clocking-buffer.
> (org-clock-out): Changed reference to org-clocking-buffer.
> (org-clock-cancel): Changed reference to org-clocking-buffer.
> (org-clock-sum): Changed reference to org-clocking-buffer.
> (org-clock-out-if-current): Changed reference to org-clocking-buffer.
> (org-clock-save): Changed reference to org-clocking-buffer.
> ---
>  lisp/org-clock.el | 20 +++++++++-----------
>  1 file changed, 9 insertions(+), 11 deletions(-)
>
> diff --git a/lisp/org-clock.el b/lisp/org-clock.el
> index 892ae1810..37459580b 100644

Hmm, this patch doesn't apply to the current master (041459727).  The
preimage blob is quite old:

  $ git describe 892ae1810
  release_8.2.7b-7-gbacfe5b4f:lisp/org-clock.el
  $ git log --oneline --format="%h %cd" --find-object=892ae1810
  ca21b7b86 Mon Jan 12 12:35:10 2015 +0100
  bacfe5b4f Fri Jul 25 11:02:55 2014 +0200

> --- a/lisp/org-clock.el
> +++ b/lisp/org-clock.el
> @@ -503,13 +503,11 @@ of a different task.")
>    (mapc (lambda (m) (org-check-and-save-marker m beg end))
>  	org-clock-history))
>  
> -(defun org-clocking-buffer ()
> -  "Return the clocking buffer if we are currently clocking a task or nil."
> -  (marker-buffer org-clock-marker))
> +(defalias 'org-clocking-buffer #'org-clock-is-active)
>  
>  (defun org-clocking-p ()
>    "Return t when clocking a task."
> -  (not (equal (org-clocking-buffer) nil)))
> +  (not (equal (org-clock-is-active) nil)))

Eh, so this too could just be an alias to org-clock-is-active, or, if it
looks like any callers really depend on this being t rather than just
non-nil (but why would they?), `(and (org-clock-is-active) t)' would be
better.  Anyway, I know you're just doing the plain substitution here,
so I'm fine keeping it at that.

>  
>  (defvar org-clock-before-select-task-hook nil
>    "Hook called in task selection just before prompting the user.")
> @@ -1501,7 +1499,7 @@ to, overriding the existing value of `org-clock-out-switch-to-state'."
>  	  ts te s h m remove)
>        (setq org-clock-out-time now)
>        (save-excursion ; Do not replace this with `with-current-buffer'.
> -	(org-no-warnings (set-buffer (org-clocking-buffer)))
> +	(org-no-warnings (set-buffer (org-clock-is-active)))

This is an example of a spot that I think should continue using the
org-clocking-buffer variant for readability.  And scanning the other
spots in this patch, I think they actually all fall into this category.

> Subject: [PATCH 2/2] org-clock: Query when exiting with running clock
>
> It's annoying to accidentally quit Emacs with a running clock, then
> resolve the clock the next time when Emacs is started.
>
> * lisp/org-clock.el (org-clock-kill-emacs-query): New function.
> ---
>  lisp/org-clock.el | 9 +++++++++
>  1 file changed, 9 insertions(+)
>
> diff --git a/lisp/org-clock.el b/lisp/org-clock.el
> index 37459580b..bc1762f63 100644
> --- a/lisp/org-clock.el
> +++ b/lisp/org-clock.el
> @@ -2886,6 +2886,15 @@ The details of what will be saved are regulated by the variable
>  		(if (outline-invisible-p)
>  		    (org-show-context))))))))))
>  
> +(defun org-clock-kill-emacs-query ()
> +  "Query user when killing Emacs.
> +This function is added to `kill-emacs-query-functions'."
> +  (if (org-clocking-buffer)

Hmm, why use org-clocking-buffer rather than org-clock-is-active?  After
a patch that introduced org-clock-is-active and switched a bunch of
spots over to it, I would have expected you to use it here.

> +      (y-or-n-p "Org clock is running; exit anyway? ")
> +    t))
> +
> +(add-hook 'kill-emacs-query-functions #'org-clock-kill-emacs-query)

lisp/calendar/timeclock.el has the following option:

  (defcustom timeclock-ask-before-exiting t
    "If non-nil, ask if the user wants to clock out before exiting Emacs.
  This variable only has effect if set with \\[customize]."
    :set (lambda (symbol value)
  	 (if value
  	     (add-hook 'kill-emacs-query-functions #'timeclock-query-out)
  	   (remove-hook 'kill-emacs-query-functions #'timeclock-query-out))
  	 (set symbol value))
    :type 'boolean)

I wonder if we should do something similar.


  reply	other threads:[~2021-02-03  5:46 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-12  8:55 [PATCH] Query when exiting with running clock Allen Li
2021-02-03  5:45 ` Kyle Meyer [this message]
2021-03-03  2:08   ` Allen Li
2021-03-04  3:54     ` Kyle Meyer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=878s85ya9u.fsf@kyleam.com \
    --to=kyle@kyleam.com \
    --cc=darkfeline@felesatra.moe \
    --cc=emacs-orgmode@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).