Subject: Re: bug#38264: 27.0.50; Emacs terminates unexpectedly when noninteractive is t

From: Ihor Radchenko <[email-masked]>
Date: Thu, 21 Nov 2019 00:35:50 +0800

> How can Emacs distinguish between these two situations?  The value of
> 'noninteractive' is how it knows whether the session is an interactive
> one, and your code steps on it.

I agree that it indeed conforms with the manual (though it might make
sense to add a note to the manual that setting noninteractive manually
can cause issues). 
I am also wondering why there is no error shown in the terminal when
emacs is terminated after executing the code I provided.
I tried to run emacs in batch mode directly like

$ emacs -Q --batch --eval '(/ 1 0)'
Arithmetic error

As expected, emacs prints "Arithmetic error" in the output.
However, if I just run emacs -Q and execute the same with noninteractive
bound to t, no output is produced in the terminal, which is very
misleading since no clue is provided why emacs was terminated.

Also, it seems that kill-emacs-hook is not called when emacs is
terminated in the above situation. Does not sound right for me. 

> What package.el does makes little sense to me, see below.  Does
> straight.el have a reason to do the same, you did you just copy the
> code from package.el?

I suspect that it was just copying. Will forward your question to the
straight.el author.

Regards,
Ihor

Eli Zaretskii <[email-masked]> writes:

>> From: Ihor Radchenko <[email-masked]>
>> Cc: [email-masked]
>> Date: Wed, 20 Nov 2019 00:57:18 +0800
>> 
>> > This is a feature: in non-interactive mode entering a debugger
>> > displays the backtrace and then kills Emacs.
>> 
>> It indeed makes sense. However, it does not make sense when
>> noninteractive is manually set to 't in normal interactive mode.
>
> How can Emacs distinguish between these two situations?  The value of
> 'noninteractive' is how it knows whether the session is an interactive
> one, and your code steps on it.
>
>> Note that package.el, for example, can set noninteractive to 't at some 
>> point (see package-generate-autoloads), even if emacs is otherwise
>> interactive. 
>> 
>> > Why are you binding noninteractive to t while debug-on-error is
>> > enabled?
>> 
>> Similar to package.el, straight.el also binds noninteractive to 't when
>> generating autoloads.
>
> What package.el does makes little sense to me, see below.  Does
> straight.el have a reason to do the same, you did you just copy the
> code from package.el?
>
> If the code in straight.el is simply a copy from package.el, then just
> remove the line which binds 'noninteractive'.  You don't need it
> because all it does is disable calls to 'message' inside
> 'autoload-generate-file-autoloads', and you already bind
> 'inhibit-message' to t, so no messages will be displayed anyway.
>
> Artur, I think for the same reason we have no need to bind
> 'noninteractive' in 'package-generate-autoloads', or am I missing
> something?
>
> Btw, the other places in package.el which use 'inhibit-message' to
> bind 'save-silently' to a non-nil value seem also redundant, since if
> 'inhibit-message' is non-nil, its effect is a superset of what
> 'save-silently' does anyway.  WDYT?