]> git.eshelyaron.com Git - emacs.git/commitdiff
In batch mode, avoid killing Emacs with C-g in the minibuffer
authorMiha Rihtaršič <miha@kamnitnik.top>
Wed, 1 Sep 2021 08:10:44 +0000 (10:10 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Wed, 1 Sep 2021 08:10:44 +0000 (10:10 +0200)
* src/keyboard.c (Fcommand_error_default_function): Don't kill emacs
when handling the minibuffer-quit condition (bug#48603).

src/keyboard.c

index 81ff9df153d0e6e2d69486c2b3cc39f220e7db9a..6a8c33ae3b60b00e7704b0e3f6b9b64628152cf8 100644 (file)
@@ -1009,25 +1009,28 @@ Default value of `command-error-function'.  */)
   (Lisp_Object data, Lisp_Object context, Lisp_Object signal)
 {
   struct frame *sf = SELECTED_FRAME ();
-  Lisp_Object conditions;
+  Lisp_Object conditions = Fget (XCAR (data), Qerror_conditions);
+  int is_minibuffer_quit = !NILP (Fmemq (Qminibuffer_quit, conditions));
 
   CHECK_STRING (context);
 
   /* If the window system or terminal frame hasn't been initialized
-     yet, or we're not interactive, write the message to stderr and exit.  */
-  if (!sf->glyphs_initialized_p
-          /* The initial frame is a special non-displaying frame. It
-             will be current in daemon mode when there are no frames
-             to display, and in non-daemon mode before the real frame
-             has finished initializing.  If an error is thrown in the
-             latter case while creating the frame, then the frame
-             will never be displayed, so the safest thing to do is
-             write to stderr and quit.  In daemon mode, there are
-             many other potential errors that do not prevent frames
-             from being created, so continuing as normal is better in
-             that case.  */
-          || (!IS_DAEMON && FRAME_INITIAL_P (sf))
-          || noninteractive)
+     yet, or we're not interactive, write the message to stderr and exit.
+     Don't do this for the minibuffer-quit condition.  */
+  if (!is_minibuffer_quit
+      && (!sf->glyphs_initialized_p
+         /* The initial frame is a special non-displaying frame. It
+            will be current in daemon mode when there are no frames
+            to display, and in non-daemon mode before the real frame
+            has finished initializing.  If an error is thrown in the
+            latter case while creating the frame, then the frame
+            will never be displayed, so the safest thing to do is
+            write to stderr and quit.  In daemon mode, there are
+            many other potential errors that do not prevent frames
+            from being created, so continuing as normal is better in
+            that case.  */
+         || (!IS_DAEMON && FRAME_INITIAL_P (sf))
+         || noninteractive))
     {
       print_error_message (data, Qexternal_debugging_output,
                           SSDATA (context), signal);
@@ -1036,12 +1039,10 @@ Default value of `command-error-function'.  */)
     }
   else
     {
-      conditions = Fget (XCAR (data), Qerror_conditions);
-
       clear_message (1, 0);
       message_log_maybe_newline ();
 
-      if (!NILP (Fmemq (Qminibuffer_quit, conditions)))
+      if (is_minibuffer_quit)
        {
          Fding (Qt);
        }