unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Re: [Emacs-diffs] emacs-26 03bb7a8: Avoid clearing echo-area message by auto-save-visited-file-name
       [not found] ` <20181126172848.D835220427@vcs0.savannah.gnu.org>
@ 2018-11-26 17:43   ` Stefan Monnier
  2018-11-26 18:11     ` Eli Zaretskii
  0 siblings, 1 reply; 9+ messages in thread
From: Stefan Monnier @ 2018-11-26 17:43 UTC (permalink / raw)
  To: emacs-devel; +Cc: Eli Zaretskii

> +         (msg (current-message))
[...]
> +      (message (or msg "")))

If `msg` contains percent characters, they'll be interpreted as
formatting instructions by `message`.


        Stefan



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Emacs-diffs] emacs-26 03bb7a8: Avoid clearing echo-area message by auto-save-visited-file-name
  2018-11-26 17:43   ` [Emacs-diffs] emacs-26 03bb7a8: Avoid clearing echo-area message by auto-save-visited-file-name Stefan Monnier
@ 2018-11-26 18:11     ` Eli Zaretskii
  2018-11-26 19:20       ` Eric Abrahamsen
  0 siblings, 1 reply; 9+ messages in thread
From: Eli Zaretskii @ 2018-11-26 18:11 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

> From: Stefan Monnier <monnier@IRO.UMontreal.CA>
> Cc: Eli Zaretskii <eliz@gnu.org>
> Date: Mon, 26 Nov 2018 12:43:33 -0500
> 
> > +         (msg (current-message))
> [...]
> > +      (message (or msg "")))
> 
> If `msg` contains percent characters, they'll be interpreted as
> formatting instructions by `message`.

Feel free to fix.



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Emacs-diffs] emacs-26 03bb7a8: Avoid clearing echo-area message by auto-save-visited-file-name
  2018-11-26 18:11     ` Eli Zaretskii
@ 2018-11-26 19:20       ` Eric Abrahamsen
  2018-11-26 19:31         ` Eli Zaretskii
  0 siblings, 1 reply; 9+ messages in thread
From: Eric Abrahamsen @ 2018-11-26 19:20 UTC (permalink / raw)
  To: emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Stefan Monnier <monnier@IRO.UMontreal.CA>
>> Cc: Eli Zaretskii <eliz@gnu.org>
>> Date: Mon, 26 Nov 2018 12:43:33 -0500
>> 
>> > +         (msg (current-message))
>> [...]
>> > +      (message (or msg "")))
>> 
>> If `msg` contains percent characters, they'll be interpreted as
>> formatting instructions by `message`.
>
> Feel free to fix.

Isn't this what `with-temp-message' is for?




^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Emacs-diffs] emacs-26 03bb7a8: Avoid clearing echo-area message by auto-save-visited-file-name
  2018-11-26 19:20       ` Eric Abrahamsen
@ 2018-11-26 19:31         ` Eli Zaretskii
  2018-11-26 20:11           ` Eric Abrahamsen
  0 siblings, 1 reply; 9+ messages in thread
From: Eli Zaretskii @ 2018-11-26 19:31 UTC (permalink / raw)
  To: Eric Abrahamsen; +Cc: emacs-devel

> From: Eric Abrahamsen <eric@ericabrahamsen.net>
> Date: Mon, 26 Nov 2018 11:20:21 -0800
> 
> Isn't this what `with-temp-message' is for?

I concluded with-temp-message won't fit the bill here (we prompt the
user for responses), but maybe I misunderstood something.  Take a look
at the code, and if you can propose a cleaner solution, please do.

Thanks.



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Emacs-diffs] emacs-26 03bb7a8: Avoid clearing echo-area message by auto-save-visited-file-name
  2018-11-26 19:31         ` Eli Zaretskii
@ 2018-11-26 20:11           ` Eric Abrahamsen
  2018-11-26 20:45             ` Eli Zaretskii
  0 siblings, 1 reply; 9+ messages in thread
From: Eric Abrahamsen @ 2018-11-26 20:11 UTC (permalink / raw)
  To: emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Eric Abrahamsen <eric@ericabrahamsen.net>
>> Date: Mon, 26 Nov 2018 11:20:21 -0800
>> 
>> Isn't this what `with-temp-message' is for?
>
> I concluded with-temp-message won't fit the bill here (we prompt the
> user for responses), but maybe I misunderstood something.  Take a look
> at the code, and if you can propose a cleaner solution, please do.
>
> Thanks.

Well... I highly doubt I've seen something you haven't, but the
following seems to work correctly, doesn't it?


(setq lexical-binding t)

(defun tst ()
  (interactive)
  (let ((msg "Hi!")
	(lst '("one" "two" "three")))
    (message msg)
    (sit-for 1)
    (my-map-y-or-n-p "Upcase %s? " #'upcase lst)))

(defun my-map-y-or-n-p (prompter actor list &optional help action-alist
				 no-cursor-in-echo-area)
  "Ask a series of boolean questions.
Takes args PROMPTER ACTOR LIST, and optional args HELP and ACTION-ALIST.

LIST is a list of objects, or a function of no arguments to return the next
object or nil.

If PROMPTER is a string, the prompt is \(format PROMPTER OBJECT).  If not
a string, PROMPTER is a function of one arg (an object from LIST), which
returns a string to be used as the prompt for that object.  If the return
value is not a string, it may be nil to ignore the object or non-nil to act
on the object without asking the user.

ACTOR is a function of one arg (an object from LIST),
which gets called with each object that the user answers `yes' for.

If HELP is given, it is a list (OBJECT OBJECTS ACTION),
where OBJECT is a string giving the singular noun for an elt of LIST;
OBJECTS is the plural noun for elts of LIST, and ACTION is a transitive
verb describing ACTOR.  The default is \(\"object\" \"objects\" \"act on\").

At the prompts, the user may enter y, Y, or SPC to act on that object;
n, N, or DEL to skip that object; ! to act on all following objects;
ESC or q to exit (skip all following objects); . (period) to act on the
current object and then exit; or \\[help-command] to get help.

If ACTION-ALIST is given, it is an alist (KEY FUNCTION HELP) of extra keys
that will be accepted.  KEY is a character; FUNCTION is a function of one
arg (an object from LIST); HELP is a string.  When the user hits KEY,
FUNCTION is called.  If it returns non-nil, the object is considered
\"acted upon\", and the next object from LIST is processed.  If it returns
nil, the prompt is repeated for the same object.

Final optional argument NO-CURSOR-IN-ECHO-AREA non-nil says not to set
`cursor-in-echo-area' while prompting.

This function uses `query-replace-map' to define the standard responses,
but not all of the responses which `query-replace' understands
are meaningful here.

Returns the number of actions taken."
  (let* ((actions 0)
	 user-keys mouse-event map prompt char elt def
	 ;; Non-nil means we should use mouse menus to ask.
	 use-menus
	 delayed-switch-frame
         ;; Rebind other-window-scroll-buffer so that subfunctions can set
         ;; it temporarily, without risking affecting the caller.
         (other-window-scroll-buffer other-window-scroll-buffer)
	 (next (if (functionp list)
                   (lambda () (setq elt (funcall list)))
                 (lambda () (when list
			      (setq elt (pop list))
			      t))))
	 (try-again (lambda ()
		      (let ((x next))
			(setq next (lambda () (setq next x) elt))))))
    (if (and (listp last-nonmenu-event)
	     use-dialog-box)
	;; Make a list describing a dialog box.
	(let ((objects (if help (capitalize (nth 1 help))))
	      (action (if help (capitalize (nth 2 help)))))
	  (setq map `(("Yes" . act) ("No" . skip)
		      ,@(mapcar (lambda (elt)
				  (cons (with-syntax-table
					    text-mode-syntax-table
					  (capitalize (nth 2 elt)))
					(vector (nth 1 elt))))
				action-alist)
		      (,(if help (concat action " This But No More")
			  "Do This But No More") . act-and-exit)
		      (,(if help (concat action " All " objects)
			  "Do All") . automatic)
		      ("No For All" . exit))
		use-menus t
		mouse-event last-nonmenu-event))
      (setq user-keys (if action-alist
			  (concat (mapconcat (lambda (elt)
                                               (key-description
                                                (vector (car elt))))
					     action-alist ", ")
				  " ")
			"")
	    ;; Make a map that defines each user key as a vector containing
	    ;; its definition.
	    map
            (let ((map (make-sparse-keymap)))
              (set-keymap-parent map query-replace-map)
              (dolist (elt action-alist)
                (define-key map (vector (car elt)) (vector (nth 1 elt))))
              map)))
    (with-temp-message ""
     (unwind-protect
	 (progn
	   (if (stringp prompter)
	       (setq prompter (let ((prompter prompter))
				(lambda (object)
				  (format prompter object)))))
	   (while (funcall next)
	     (setq prompt (funcall prompter elt))
	     (cond ((stringp prompt)
		    ;; Prompt the user about this object.
		    (setq quit-flag nil)
		    (if use-menus
			(setq def (or (x-popup-dialog (or mouse-event use-menus)
						      (cons prompt map))
				      'quit))
		      ;; Prompt in the echo area.
		      (let ((cursor-in-echo-area (not no-cursor-in-echo-area)))
			(message (apply 'propertize "%s(y, n, !, ., q, %sor %s) "
					minibuffer-prompt-properties)
				 prompt user-keys
				 (key-description (vector help-char)))
			(if minibuffer-auto-raise
			    (raise-frame (window-frame (minibuffer-window))))
			(while (progn
				 (setq char (read-event))
				 ;; If we get -1, from end of keyboard
				 ;; macro, try again.
                                 (equal char -1)))
			;; Show the answer to the question.
			(message "%s(y, n, !, ., q, %sor %s) %s"
				 prompt user-keys
				 (key-description (vector help-char))
				 (single-key-description char)))
		      (setq def (lookup-key map (vector char))))
		    (cond ((eq def 'exit)
			   (setq next (lambda () nil)))
			  ((eq def 'act)
			   ;; Act on the object.
			   (funcall actor elt)
			   (setq actions (1+ actions)))
			  ((eq def 'skip)
			   ;; Skip the object.
			   )
			  ((eq def 'act-and-exit)
			   ;; Act on the object and then exit.
			   (funcall actor elt)
			   (setq actions (1+ actions)
				 next (lambda () nil)))
			  ((eq def 'quit)
			   (setq quit-flag t)
			   (funcall try-again))
			  ((eq def 'automatic)
			   ;; Act on this and all following objects.
			   (if (funcall prompter elt)
			       (progn
				 (funcall actor elt)
				 (setq actions (1+ actions))))
			   (while (funcall next)
			     (if (funcall prompter elt)
				 (progn
				   (funcall actor elt)
				   (setq actions (1+ actions))))))
			  ((eq def 'help)
			   (with-output-to-temp-buffer "*Help*"
			     (princ
			      (let ((object (if help (nth 0 help) "object"))
				    (objects (if help (nth 1 help) "objects"))
				    (action (if help (nth 2 help) "act on")))
				(concat
				 (format-message "\
Type SPC or `y' to %s the current %s;
DEL or `n' to skip the current %s;
RET or `q' to give up on the %s (skip all remaining %s);
C-g to quit (cancel the whole command);
! to %s all remaining %s;\n"
						 action object object action objects action
						 objects)
				 (mapconcat (function
					     (lambda (elt)
					       (format "%s to %s"
						       (single-key-description
							(nth 0 elt))
						       (nth 2 elt))))
					    action-alist
					    ";\n")
				 (if action-alist ";\n")
				 (format "or . (period) to %s \
the current %s and exit."
					 action object))))
			     (with-current-buffer standard-output
			       (help-mode)))

			   (funcall try-again))
			  ((and (symbolp def) (commandp def))
			   (call-interactively def)
			   ;; Regurgitated; try again.
			   (funcall try-again))
			  ((vectorp def)
			   ;; A user-defined key.
			   (if (funcall (aref def 0) elt) ;Call its function.
			       ;; The function has eaten this object.
			       (setq actions (1+ actions))
			     ;; Regurgitated; try again.
			     (funcall try-again)))
			  ((and (consp char)
				(eq (car char) 'switch-frame))
			   ;; switch-frame event.  Put it off until we're done.
			   (setq delayed-switch-frame char)
			   (funcall try-again))
			  (t
			   ;; Random char.
			   (message "Type %s for help."
				    (key-description (vector help-char)))
			   (beep)
			   (sit-for 1)
			   (funcall try-again))))
		   (prompt
		    (funcall actor elt)
		    (setq actions (1+ actions))))))
       (if delayed-switch-frame
	   (setq unread-command-events
		 (cons delayed-switch-frame unread-command-events)))))
    ;; Clear the last prompt from the minibuffer, and restore the
    ;; previous echo-area message, if any.
    ;; Return the number of actions that were taken.
    actions))




^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Emacs-diffs] emacs-26 03bb7a8: Avoid clearing echo-area message by auto-save-visited-file-name
  2018-11-26 20:11           ` Eric Abrahamsen
@ 2018-11-26 20:45             ` Eli Zaretskii
  2018-11-26 21:03               ` Eric Abrahamsen
  0 siblings, 1 reply; 9+ messages in thread
From: Eli Zaretskii @ 2018-11-26 20:45 UTC (permalink / raw)
  To: Eric Abrahamsen; +Cc: emacs-devel

> From: Eric Abrahamsen <eric@ericabrahamsen.net>
> Date: Mon, 26 Nov 2018 12:11:46 -0800
> 
> Well... I highly doubt I've seen something you haven't, but the
> following seems to work correctly, doesn't it?

How can I tell?



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Emacs-diffs] emacs-26 03bb7a8: Avoid clearing echo-area message by auto-save-visited-file-name
  2018-11-26 20:45             ` Eli Zaretskii
@ 2018-11-26 21:03               ` Eric Abrahamsen
  2018-11-27  5:44                 ` Eli Zaretskii
  0 siblings, 1 reply; 9+ messages in thread
From: Eric Abrahamsen @ 2018-11-26 21:03 UTC (permalink / raw)
  To: emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Eric Abrahamsen <eric@ericabrahamsen.net>
>> Date: Mon, 26 Nov 2018 12:11:46 -0800
>> 
>> Well... I highly doubt I've seen something you haven't, but the
>> following seems to work correctly, doesn't it?
>
> How can I tell?

The "Hi!" message remains visible after the `map-y-or-n-p' call returns.
I thought that was the requirement -- if not, I didn't read the thread
carefully enough, and apologize for the derailment...




^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Emacs-diffs] emacs-26 03bb7a8: Avoid clearing echo-area message by auto-save-visited-file-name
  2018-11-26 21:03               ` Eric Abrahamsen
@ 2018-11-27  5:44                 ` Eli Zaretskii
  2018-11-27 17:30                   ` Eric Abrahamsen
  0 siblings, 1 reply; 9+ messages in thread
From: Eli Zaretskii @ 2018-11-27  5:44 UTC (permalink / raw)
  To: Eric Abrahamsen; +Cc: emacs-devel

> From: Eric Abrahamsen <eric@ericabrahamsen.net>
> Date: Mon, 26 Nov 2018 13:03:54 -0800
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> From: Eric Abrahamsen <eric@ericabrahamsen.net>
> >> Date: Mon, 26 Nov 2018 12:11:46 -0800
> >> 
> >> Well... I highly doubt I've seen something you haven't, but the
> >> following seems to work correctly, doesn't it?
> >
> > How can I tell?
> 
> The "Hi!" message remains visible after the `map-y-or-n-p' call returns.

That's not what I meant.  My problem is that this change was done on
the release branch, and is part of both auto-save-visited-file-name
and of save-some-buffers, the latter is an important frequently used
command.  I need to be absolutely sure using with-temp-message doesn't
change these use cases in any significant way, to be able to use it on
the release branch.  And neither the non-trivial code of
with-temp-message nor its doc string allow me to convince myself that
this is the case.

So if you think my change is equivalent to using with-temp-message,
I'm okay with doing that on master, but on emacs-26 I would need a
much stronger evidence than just its working in a single simple use
case.

Thanks.

P.S. May I please request that people who watch the emacs-diffs list
and respond to changes please subscribe to the bug list, where the
changes are normally discussed for several days before they are
pushed?  It is very inefficient, to say the least, to have a change
discussed, only to hear comments on it after it's already pushed.  The
discussions on the bug list, and the few days we usually wait for more
comments, are precisely to allow more people to chime in.

TIA



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Emacs-diffs] emacs-26 03bb7a8: Avoid clearing echo-area message by auto-save-visited-file-name
  2018-11-27  5:44                 ` Eli Zaretskii
@ 2018-11-27 17:30                   ` Eric Abrahamsen
  0 siblings, 0 replies; 9+ messages in thread
From: Eric Abrahamsen @ 2018-11-27 17:30 UTC (permalink / raw)
  To: emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Eric Abrahamsen <eric@ericabrahamsen.net>
>> Date: Mon, 26 Nov 2018 13:03:54 -0800
>> 
>> Eli Zaretskii <eliz@gnu.org> writes:
>> 
>> >> From: Eric Abrahamsen <eric@ericabrahamsen.net>
>> >> Date: Mon, 26 Nov 2018 12:11:46 -0800
>> >> 
>> >> Well... I highly doubt I've seen something you haven't, but the
>> >> following seems to work correctly, doesn't it?
>> >
>> > How can I tell?
>> 
>> The "Hi!" message remains visible after the `map-y-or-n-p' call returns.
>
> That's not what I meant.  My problem is that this change was done on
> the release branch, and is part of both auto-save-visited-file-name
> and of save-some-buffers, the latter is an important frequently used
> command.  I need to be absolutely sure using with-temp-message doesn't
> change these use cases in any significant way, to be able to use it on
> the release branch.  And neither the non-trivial code of
> with-temp-message nor its doc string allow me to convince myself that
> this is the case.
>
> So if you think my change is equivalent to using with-temp-message,
> I'm okay with doing that on master, but on emacs-26 I would need a
> much stronger evidence than just its working in a single simple use
> case.

I don't have any confidence that I understand this issue beyond the
simple test case. Sorry for jumping in unhelpfully.




^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2018-11-27 17:30 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <20181126172847.31607.25553@vcs0.savannah.gnu.org>
     [not found] ` <20181126172848.D835220427@vcs0.savannah.gnu.org>
2018-11-26 17:43   ` [Emacs-diffs] emacs-26 03bb7a8: Avoid clearing echo-area message by auto-save-visited-file-name Stefan Monnier
2018-11-26 18:11     ` Eli Zaretskii
2018-11-26 19:20       ` Eric Abrahamsen
2018-11-26 19:31         ` Eli Zaretskii
2018-11-26 20:11           ` Eric Abrahamsen
2018-11-26 20:45             ` Eli Zaretskii
2018-11-26 21:03               ` Eric Abrahamsen
2018-11-27  5:44                 ` Eli Zaretskii
2018-11-27 17:30                   ` Eric Abrahamsen

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.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).