unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Why does signaling an error not call set-message-function?
@ 2022-04-05  8:01 Mario Lang
  2022-04-05 11:38 ` Eli Zaretskii
  0 siblings, 1 reply; 12+ messages in thread
From: Mario Lang @ 2022-04-05  8:01 UTC (permalink / raw)
  To: emacs-devel

Hi.

I just realized that only a certain type of message goes through
`set-message-function'.  In particular, things like

(signal 'end-of-buffer nil)

write to the echo area but do not trigger set-message-function.

This is a bit unexpected.  Is there an equivalent hook for
error messages going to the echo area?

-- 
CYa,
  ⡍⠁⠗⠊⠕



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

* Re: Why does signaling an error not call set-message-function?
  2022-04-05  8:01 Why does signaling an error not call set-message-function? Mario Lang
@ 2022-04-05 11:38 ` Eli Zaretskii
  2022-04-05 12:05   ` Mario Lang
  0 siblings, 1 reply; 12+ messages in thread
From: Eli Zaretskii @ 2022-04-05 11:38 UTC (permalink / raw)
  To: Mario Lang; +Cc: emacs-devel

> From: Mario Lang <mlang@blind.guru>
> Date: Tue, 05 Apr 2022 10:01:58 +0200
> 
> Hi.
> 
> I just realized that only a certain type of message goes through
> `set-message-function'.  In particular, things like
> 
> (signal 'end-of-buffer nil)
> 
> write to the echo area but do not trigger set-message-function.
> 
> This is a bit unexpected.  Is there an equivalent hook for
> error messages going to the echo area?

(set-message-function _does_ affect echo-area messages, just not any
kind of them.)

Are you sure it is a good idea to allow running arbitrary Lisp when
Emacs wants to signal an error?



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

* Re: Why does signaling an error not call set-message-function?
  2022-04-05 11:38 ` Eli Zaretskii
@ 2022-04-05 12:05   ` Mario Lang
  2022-04-05 12:21     ` Eli Zaretskii
  0 siblings, 1 reply; 12+ messages in thread
From: Mario Lang @ 2022-04-05 12:05 UTC (permalink / raw)
  To: emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Mario Lang <mlang@blind.guru>
>> Date: Tue, 05 Apr 2022 10:01:58 +0200
>> 
>> Hi.
>> 
>> I just realized that only a certain type of message goes through
>> `set-message-function'.  In particular, things like
>> 
>> (signal 'end-of-buffer nil)
>> 
>> write to the echo area but do not trigger set-message-function.
>> 
>> This is a bit unexpected.  Is there an equivalent hook for
>> error messages going to the echo area?
>
> (set-message-function _does_ affect echo-area messages, just not any
> kind of them.)

OK, point taken.

> Are you sure it is a good idea to allow running arbitrary Lisp when
> Emacs wants to signal an error?

My motivation is that I am trying to redirect echo area messages to an
external display.  Why?  Think of it like Emacspeak for braille users.
When I press M-< "Mark set" is displayed,
but if I press cursor up, "Beginning of buffer" is not.
This seems arbitrary.  I realize that signals which pop up the
debugger / backtrace might be problematic to interfere with, but...
The messages from `user-error' and those error symbols which only
display an echo area message should be easier to programmatically see IMO.

-- 
CYa,
  ⡍⠁⠗⠊⠕



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

* Re: Why does signaling an error not call set-message-function?
  2022-04-05 12:05   ` Mario Lang
@ 2022-04-05 12:21     ` Eli Zaretskii
  2022-04-05 12:55       ` Mario Lang
  2022-04-05 13:14       ` Stefan Monnier
  0 siblings, 2 replies; 12+ messages in thread
From: Eli Zaretskii @ 2022-04-05 12:21 UTC (permalink / raw)
  To: Mario Lang; +Cc: emacs-devel

> From: Mario Lang <mlang@blind.guru>
> Date: Tue, 05 Apr 2022 14:05:00 +0200
> 
> > Are you sure it is a good idea to allow running arbitrary Lisp when
> > Emacs wants to signal an error?
> 
> My motivation is that I am trying to redirect echo area messages to an
> external display.  Why?  Think of it like Emacspeak for braille users.
> When I press M-< "Mark set" is displayed,
> but if I press cursor up, "Beginning of buffer" is not.
> This seems arbitrary.  I realize that signals which pop up the
> debugger / backtrace might be problematic to interfere with, but...
> The messages from `user-error' and those error symbols which only
> display an echo area message should be easier to programmatically see IMO.

AFAIR, the set-message-function feature is explicitly for controlling
the output that goes via calls to 'message'.  Maybe we should
emphasize this in the doc string.



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

* Re: Why does signaling an error not call set-message-function?
  2022-04-05 12:21     ` Eli Zaretskii
@ 2022-04-05 12:55       ` Mario Lang
  2022-04-05 13:58         ` T.V Raman
  2022-04-05 13:14       ` Stefan Monnier
  1 sibling, 1 reply; 12+ messages in thread
From: Mario Lang @ 2022-04-05 12:55 UTC (permalink / raw)
  To: emacs-devel; +Cc: raman

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Mario Lang <mlang@blind.guru>
>> Date: Tue, 05 Apr 2022 14:05:00 +0200
>> 
>> > Are you sure it is a good idea to allow running arbitrary Lisp when
>> > Emacs wants to signal an error?
>> 
>> My motivation is that I am trying to redirect echo area messages to an
>> external display.  Why?  Think of it like Emacspeak for braille users.
>> When I press M-< "Mark set" is displayed,
>> but if I press cursor up, "Beginning of buffer" is not.
>> This seems arbitrary.  I realize that signals which pop up the
>> debugger / backtrace might be problematic to interfere with, but...
>> The messages from `user-error' and those error symbols which only
>> display an echo area message should be easier to programmatically see IMO.
>
> AFAIR, the set-message-function feature is explicitly for controlling
> the output that goes via calls to 'message'.  Maybe we should
> emphasize this in the doc string.

OK, I get it, `set-message-function' is for `message' only.

@Raman: How do you solve this in Emacspeak?
IOW, if (user-error "foo") or (signal 'beginning-of-buffer nil) are
called, how does Emacspeak collect the resulting echo area output?

The only hack I can think of is to advice `user-error'
and `signal', and DTRT if `signal' is called with a symbol that has an
error-message slot.

-- 
CYa,
  ⡍⠁⠗⠊⠕



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

* Re: Why does signaling an error not call set-message-function?
  2022-04-05 12:21     ` Eli Zaretskii
  2022-04-05 12:55       ` Mario Lang
@ 2022-04-05 13:14       ` Stefan Monnier
  2022-04-05 13:20         ` Eli Zaretskii
  1 sibling, 1 reply; 12+ messages in thread
From: Stefan Monnier @ 2022-04-05 13:14 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Mario Lang, emacs-devel

> AFAIR, the set-message-function feature is explicitly for controlling
> the output that goes via calls to 'message'.  Maybe we should
> emphasize this in the doc string.

OTOH which echo-area message goes through `message` and which goes
through some lower-level C function is largely an implementation detail
(e.g. in order to know that uncaught errors get displayed without going
through `message` the user has to read the C code, AFAICT), so I think
it makes sense to try and make sure we go through `set-message-function`
whenever possible.


        Stefan




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

* Re: Why does signaling an error not call set-message-function?
  2022-04-05 13:14       ` Stefan Monnier
@ 2022-04-05 13:20         ` Eli Zaretskii
  2022-04-05 13:34           ` Stefan Monnier
  0 siblings, 1 reply; 12+ messages in thread
From: Eli Zaretskii @ 2022-04-05 13:20 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: mlang, emacs-devel

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: Mario Lang <mlang@blind.guru>,  emacs-devel@gnu.org
> Date: Tue, 05 Apr 2022 09:14:58 -0400
> 
> > AFAIR, the set-message-function feature is explicitly for controlling
> > the output that goes via calls to 'message'.  Maybe we should
> > emphasize this in the doc string.
> 
> OTOH which echo-area message goes through `message` and which goes
> through some lower-level C function is largely an implementation detail
> (e.g. in order to know that uncaught errors get displayed without going
> through `message` the user has to read the C code, AFAICT), so I think
> it makes sense to try and make sure we go through `set-message-function`
> whenever possible.

But not when we signal an error, surely?



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

* Re: Why does signaling an error not call set-message-function?
  2022-04-05 13:20         ` Eli Zaretskii
@ 2022-04-05 13:34           ` Stefan Monnier
  2022-04-05 13:39             ` Eli Zaretskii
  0 siblings, 1 reply; 12+ messages in thread
From: Stefan Monnier @ 2022-04-05 13:34 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: mlang, emacs-devel

> But not when we signal an error, surely?

Why not?

I don't see a problem running arbitrary ELisp code at that time.

After all, we already exited the error-signaling context, and we'll run
arbitrary ELisp code right after, e.g. for `post-command-hook`, for the
next command, etc...


        Stefan




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

* Re: Why does signaling an error not call set-message-function?
  2022-04-05 13:34           ` Stefan Monnier
@ 2022-04-05 13:39             ` Eli Zaretskii
  2022-04-05 14:19               ` Stefan Monnier
  0 siblings, 1 reply; 12+ messages in thread
From: Eli Zaretskii @ 2022-04-05 13:39 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: mlang, emacs-devel

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: mlang@blind.guru,  emacs-devel@gnu.org
> Date: Tue, 05 Apr 2022 09:34:03 -0400
> 
> > But not when we signal an error, surely?
> 
> Why not?
> 
> I don't see a problem running arbitrary ELisp code at that time.
> 
> After all, we already exited the error-signaling context

We did?



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

* Re: Why does signaling an error not call set-message-function?
  2022-04-05 12:55       ` Mario Lang
@ 2022-04-05 13:58         ` T.V Raman
  0 siblings, 0 replies; 12+ messages in thread
From: T.V Raman @ 2022-04-05 13:58 UTC (permalink / raw)
  To: mlang; +Cc: emacs-devel, raman

Se the relevant code in module emacspeak-advice.el

Mario Lang writes:
 > Eli Zaretskii <eliz@gnu.org> writes:
 > 
 > >> From: Mario Lang <mlang@blind.guru>
 > >> Date: Tue, 05 Apr 2022 14:05:00 +0200
 > >> 
 > >> > Are you sure it is a good idea to allow running arbitrary Lisp when
 > >> > Emacs wants to signal an error?
 > >> 
 > >> My motivation is that I am trying to redirect echo area messages to an
 > >> external display.  Why?  Think of it like Emacspeak for braille users.
 > >> When I press M-< "Mark set" is displayed,
 > >> but if I press cursor up, "Beginning of buffer" is not.
 > >> This seems arbitrary.  I realize that signals which pop up the
 > >> debugger / backtrace might be problematic to interfere with, but...
 > >> The messages from `user-error' and those error symbols which only
 > >> display an echo area message should be easier to programmatically see IMO.
 > >
 > > AFAIR, the set-message-function feature is explicitly for controlling
 > > the output that goes via calls to 'message'.  Maybe we should
 > > emphasize this in the doc string.
 > 
 > OK, I get it, `set-message-function' is for `message' only.
 > 
 > @Raman: How do you solve this in Emacspeak?
 > IOW, if (user-error "foo") or (signal 'beginning-of-buffer nil) are
 > called, how does Emacspeak collect the resulting echo area output?
 > 
 > The only hack I can think of is to advice `user-error'
 > and `signal', and DTRT if `signal' is called with a symbol that has an
 > error-message slot.
 > 
 > -- 
 > CYa,
 >   ⡍⠁⠗⠊⠕

-- 

Thanks,

--Raman(I Search, I Find, I Misplace, I Research)
♉ Id: kg:/m/0285kf1  🦮

--

Thanks,

--Raman(I Search, I Find, I Misplace, I Research)
♉ Id: kg:/m/0285kf1  🦮



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

* Re: Why does signaling an error not call set-message-function?
  2022-04-05 13:39             ` Eli Zaretskii
@ 2022-04-05 14:19               ` Stefan Monnier
  2022-04-05 16:07                 ` T.V Raman
  0 siblings, 1 reply; 12+ messages in thread
From: Stefan Monnier @ 2022-04-05 14:19 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: mlang, emacs-devel

>> I don't see a problem running arbitrary ELisp code at that time.
>> After all, we already exited the error-signaling context
> We did?

You made me doubt, but indeed I see:

    Lisp_Object
    command_loop_2 (Lisp_Object handlers)
    {
      register Lisp_Object val;
    
      do
        val = internal_condition_case (command_loop_1, handlers, cmd_error);
      while (!NILP (val));
    
      return Qnil;
    }

So `cmd_error` is run after we exit the error-signaling context.
Also while looking at it, I saw tht `cmd_error` then calls
`cmd_error_internal` which calls `command-error-function`:

    command-error-function is a variable defined in ‘C source code’.
    
    Its value is ‘help-command-error-confusable-suggestions’
    
    Function to output error messages.
    Called with three arguments:
    - the error data, a list of the form (SIGNALED-CONDITION . SIGNAL-DATA)
      such as what ‘condition-case’ would bind its variable to,
    - the context (a string which normally goes at the start of the message),
    - the Lisp function within which the error was signaled.
    
    Also see ‘set-message-function’ (which controls how non-error messages
    are displayed).

So we do already allow running arbitrary ELisp code in there ;-)


        Stefan




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

* Re: Why does signaling an error not call set-message-function?
  2022-04-05 14:19               ` Stefan Monnier
@ 2022-04-05 16:07                 ` T.V Raman
  0 siblings, 0 replies; 12+ messages in thread
From: T.V Raman @ 2022-04-05 16:07 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Eli Zaretskii, mlang, emacs-devel

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset=gb18030, Size: 1965 bytes --]

Stefan Monnier <monnier@iro.umontreal.ca> writes:
Emacspeak in module emacspeak-advice.el
https://github.com/tvraman/emacspeak/blob/master/lisp/emacspeak-advice.el#L819
uses the following lines to handle this:

(defun emacspeak-error-handler (data context _calling-function)
  "Emacspeak custom error handler."
  (emacspeak-auditory-icon 'warn-user)
  (message "%s %s"
           (or context " ")
           (error-message-string data)))


 
>>> I don't see a problem running arbitrary ELisp code at that time.
>>> After all, we already exited the error-signaling context
>> We did?
>
> You made me doubt, but indeed I see:
>
>     Lisp_Object
>     command_loop_2 (Lisp_Object handlers)
>     {
>       register Lisp_Object val;
>     
>       do
>         val = internal_condition_case (command_loop_1, handlers, cmd_error);
>       while (!NILP (val));
>     
>       return Qnil;
>     }
>
> So `cmd_error` is run after we exit the error-signaling context.
> Also while looking at it, I saw tht `cmd_error` then calls
> `cmd_error_internal` which calls `command-error-function`:
>
>     command-error-function is a variable defined in ¡®C source code¡¯.
>     
>     Its value is ¡®help-command-error-confusable-suggestions¡¯
>     
>     Function to output error messages.
>     Called with three arguments:
>     - the error data, a list of the form (SIGNALED-CONDITION . SIGNAL-DATA)
>       such as what ¡®condition-case¡¯ would bind its variable to,
>     - the context (a string which normally goes at the start of the message),
>     - the Lisp function within which the error was signaled.
>     
>     Also see ¡®set-message-function¡¯ (which controls how non-error messages
>     are displayed).
>
> So we do already allow running arbitrary ELisp code in there ;-)
>
>
>         Stefan
>
>

-- 

Thanks,

--Raman(I Search, I Find, I Misplace, I Research)
7©4 Id: kg:/m/0285kf1  •0Ü8



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

end of thread, other threads:[~2022-04-05 16:07 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-05  8:01 Why does signaling an error not call set-message-function? Mario Lang
2022-04-05 11:38 ` Eli Zaretskii
2022-04-05 12:05   ` Mario Lang
2022-04-05 12:21     ` Eli Zaretskii
2022-04-05 12:55       ` Mario Lang
2022-04-05 13:58         ` T.V Raman
2022-04-05 13:14       ` Stefan Monnier
2022-04-05 13:20         ` Eli Zaretskii
2022-04-05 13:34           ` Stefan Monnier
2022-04-05 13:39             ` Eli Zaretskii
2022-04-05 14:19               ` Stefan Monnier
2022-04-05 16:07                 ` T.V Raman

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).