From a516ab79c300517d5c3ab68c45ff9c90bda6c67a Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Thu, 2 Dec 2021 12:53:59 +0100 Subject: [PATCH] Add a new variable 'process-error-pause-time' * doc/lispref/processes.texi (Asynchronous Processes): Document it. * lisp/cus-start.el (standard): Customize. * src/process.c (read_process_output_error_handler) (exec_sentinel_error_handler): Use it. (syms_of_process): New variable process-error-pause-time (bug#19457). --- doc/lispref/processes.texi | 9 +++++++++ etc/NEWS | 4 ++++ lisp/cus-start.el | 1 + src/process.c | 12 ++++++++++-- 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/doc/lispref/processes.texi b/doc/lispref/processes.texi index 8a9cb2a8f88..ac5d4d16277 100644 --- a/doc/lispref/processes.texi +++ b/doc/lispref/processes.texi @@ -966,6 +966,15 @@ use the function @code{process-tty-name} (@pxref{Process Information}). @end defvar +@defvar process-error-pause-time +If a process sentinel/filter function has an error, Emacs will (by +default) pause Emacs for @code{process-error-pause-time} seconds after +displaying this error, so that users will see the error in question. +However, this can lead to situations where Emacs becomes unresponsive +(if there's a lot of these errors happening), so this can be disabled +by setting @code{process-error-pause-time} to 0. +@end defvar + @node Deleting Processes @section Deleting Processes @cindex deleting processes diff --git a/etc/NEWS b/etc/NEWS index d783fc019cf..55733c6895d 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -75,6 +75,10 @@ time. * Changes in Emacs 29.1 +** New user option 'process-error-pause-time'. +This determines how long to pause Emacs after a process +filter/sentinel error has been handled. + +++ ** New face 'variable-pitch-text'. This face is like 'variable-pitch' (from which it inherits), but is diff --git a/lisp/cus-start.el b/lisp/cus-start.el index 53cad99692c..579beae123f 100644 --- a/lisp/cus-start.el +++ b/lisp/cus-start.el @@ -575,6 +575,7 @@ Leaving \"Default\" unchecked is equivalent with specifying a default of (ns-scroll-event-delta-factor ns float "29.1") ;; process.c (delete-exited-processes processes-basics boolean) + (process-error-pause-time processes-basics integer "29.1") ;; syntax.c (parse-sexp-ignore-comments editing-basics boolean) (words-include-escapes editing-basics boolean) diff --git a/src/process.c b/src/process.c index 241ffe9a8dd..483da4d7e4f 100644 --- a/src/process.c +++ b/src/process.c @@ -5994,7 +5994,8 @@ read_process_output_error_handler (Lisp_Object error_val) cmd_error_internal (error_val, "error in process filter: "); Vinhibit_quit = Qt; update_echo_area (); - Fsleep_for (make_fixnum (2), Qnil); + if (process_error_pause_time > 0) + Fsleep_for (make_fixnum (process_error_pause_time), Qnil); return Qt; } @@ -7421,7 +7422,8 @@ exec_sentinel_error_handler (Lisp_Object error_val) cmd_error_internal (error_val, "error in process sentinel: "); Vinhibit_quit = Qt; update_echo_area (); - Fsleep_for (make_fixnum (2), Qnil); + if (process_error_pause_time > 0) + Fsleep_for (make_fixnum (process_error_pause_time), Qnil); return Qt; } @@ -8577,6 +8579,12 @@ Enlarge the value only if the subprocess generates very large (megabytes) amounts of data in one go. */); read_process_output_max = 4096; + DEFVAR_INT ("process-error-pause-time", process_error_pause_time, + doc: /* The number of seconds to pause after handling process errors. +This isn't used for all process-related errors, but is used when a +sentinel or a process filter function has an error. */); + process_error_pause_time = 1; + DEFSYM (Qinternal_default_interrupt_process, "internal-default-interrupt-process"); DEFSYM (Qinterrupt_process_functions, "interrupt-process-functions"); -- 2.39.2