[PATCH v1 1/1] emacs: Kill the stderr buffer when an async process completes

David Edmondson dme at dme.org
Sat Aug 25 04:59:19 PDT 2018


This failure mode is very annoying. Could I persuade someone to review
the proposed change?

On Thursday, 2018-08-09 at 21:54:34 +01, David Edmondson wrote:

> On some platforms (e.g. macOS), it is necessary to add a real sentinel
> process for the error buffer used by `notmuch-start-notmuch' rather
> than a no-op sentinel.
> ---
>  emacs/notmuch-lib.el | 19 +++++++++++++------
>  1 file changed, 13 insertions(+), 6 deletions(-)
>
> diff --git a/emacs/notmuch-lib.el b/emacs/notmuch-lib.el
> index a7e02710..03c966b7 100644
> --- a/emacs/notmuch-lib.el
> +++ b/emacs/notmuch-lib.el
> @@ -909,7 +909,7 @@ invoke `set-process-sentinel' directly on the returned process,
>  as that will interfere with the handling of stderr and the exit
>  status."
>  
> -  (let (err-file err-buffer proc
> +  (let (err-file err-buffer proc err-proc
>  	;; Find notmuch using Emacs' `exec-path'
>  	(command (or (executable-find notmuch-command)
>  		     (error "Command not found: %s" notmuch-command))))
> @@ -926,11 +926,13 @@ status."
>  		      :buffer buffer
>  		      :command (cons command args)
>  		      :connection-type 'pipe
> -		      :stderr err-buffer))
> +		      :stderr err-buffer)
> +		err-proc (get-buffer-process err-buffer))
>  	  (process-put proc 'err-buffer err-buffer)
> -	  ;; Silence "Process NAME stderr finished" in stderr by adding a
> -	  ;; no-op sentinel to the fake stderr process object
> -	  (set-process-sentinel (get-buffer-process err-buffer) #'ignore))
> +
> +	  (process-put err-proc 'err-file err-file)
> +	  (process-put err-proc 'err-buffer err-buffer)
> +	  (set-process-sentinel err-proc #'notmuch-start-notmuch-error-sentinel))
>  
>        ;; On Emacs versions before 25, there is no way to capture
>        ;; stdout and stderr separately for asynchronous processes, or
> @@ -990,9 +992,14 @@ status."
>         ;; Emacs behaves strangely if an error escapes from a sentinel,
>         ;; so turn errors into messages.
>         (message "%s" (error-message-string err))))
> -    (when err-buffer (kill-buffer err-buffer))
>      (when err-file (ignore-errors (delete-file err-file)))))
>  
> +(defun notmuch-start-notmuch-error-sentinel (proc event)
> +  (let* ((err-file (process-get proc 'err-file))
> +	 (err-buffer (or (process-get proc 'err-buffer)
> +			 (find-file-noselect err-file))))
> +    (when err-buffer (kill-buffer err-buffer))))
> +
>  ;; This variable is used only buffer local, but it needs to be
>  ;; declared globally first to avoid compiler warnings.
>  (defvar notmuch-show-process-crypto nil)
> -- 
> 2.17.1 (Apple Git-112)

dme.
-- 
In heaven there is no beer, that's why we drink it here.


More information about the notmuch mailing list