From: Stefan Monnier <monnier@iro.umontreal.ca>
To: help-gnu-emacs@gnu.org
Subject: Re: How to advice save-buffers-kill-terminal?
Date: Thu, 14 Apr 2016 09:30:45 -0400 [thread overview]
Message-ID: <jwv37qofhns.fsf-monnier+gmane.emacs.help@gnu.org> (raw)
In-Reply-To: CAJQX3DwTae9rGzpix2D2jkG-wfVd6mJQpFgH4UbZhB7+mqRnSQ@mail.gmail.com
> (advice-add 'save-buffers-kill-terminal :around
> #'(lambda (oldfunc &rest r)
> (cl-flet ((yes-or-no-p (msg)
> (message "test:%S" msg)))
> (apply oldfunc r))))
> The yes-or-no-p in cl-flet doesn't affect the calling of yes-or-no-p inside
> save-buffers-kill-terminal.
Indeed. `cl-flet` is documented as being lexical, which means that it
only affects calls to `yes-or-no-p` made *syntactically within* (as
opposed to: *during the execution of*) the `cl-flet`.
> After a quick look, I found the suspicious *- lexical-binding:t -*- in
> files.el.
That's actually unrelated: `lexical-binding` affects the scoping of
variables, whereas your case depends on the scoping of functions.
> Any possibility to modify that yes-or-no-p inside
> save-buffers-kill-terminal?
Of course. You could use
(defvar my-skip-yes-or-no-p nil)
(advice-add 'yes-or-no-p :around
(lambda (orig-fun &rest args)
(if my-skip-yes-or-no-p
(apply #'message "test:%S" args)
(apply orig-fun args))))
(advice-add 'save-buffers-kill-terminal :around
#'(lambda (oldfunc &rest r)
(let ((my-skip-yes-or-no-p t))
(apply oldfunc r))))
or
(advice-add 'save-buffers-kill-terminal :around
#'(lambda (oldfunc &rest r)
(cl-letf (((symbol-function 'yes-or-no-p)
(lambda (msg) (message "test:%S" msg))))
(apply oldfunc r))))
The second is more concise, but I the like the first better, because
C-h f yes-or-no-p RET will then tell you honestly about the fact that
it's sometimes overridden.
Stefan
next prev parent reply other threads:[~2016-04-14 13:30 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-14 13:16 How to advice save-buffers-kill-terminal? Shiyao Ma
2016-04-14 13:30 ` Stefan Monnier [this message]
2016-04-15 5:41 ` Shiyao Ma
2016-04-14 13:52 ` Michael Heerdegen
2016-04-20 0:52 ` Emanuel Berg
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.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=jwv37qofhns.fsf-monnier+gmane.emacs.help@gnu.org \
--to=monnier@iro.umontreal.ca \
--cc=help-gnu-emacs@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.
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).