Subject: bug#63432: 30.0.50; Handle current-prefix-arg in async-shell-command

From: Eli Zaretskii <[email-masked]>
Date: Sat, 13 May 2023 16:43:42 +0300

> From: Gabriel <[email-masked]>
> Date: Wed, 10 May 2023 20:04:24 -0300
> 
> Steps:
> 1) emacs -Q from master branch (3adc1e7f379)
> 2) C-u M-& "ls"
>    Error: shell-command: Wrong type argument: stringp, (4)
> 
> Cause:
> When called interactively, `async-shell-command' pass argument
> OUTPUT-BUFFER as `current-prefix-arg' to `shell-command'.  As per
> docstring of `shell-command':
> 
>   "If OUTPUT-BUFFER is not a buffer and not nil (which happens
>   interactively when the prefix argument is given), insert the output in
>   current buffer after point leaving mark after it.  This cannot be done
>   asynchronously."

Yes, this bug was there since the day async-shell-command was added to
Emacs.

> diff --git a/lisp/simple.el b/lisp/simple.el
> index 58517dd81f9..ba832581955 100644
> --- a/lisp/simple.el
> +++ b/lisp/simple.el
> @@ -4499,10 +4499,12 @@ async-shell-command
>  				((eq major-mode 'dired-mode)
>  				 (dired-get-filename nil t)))))
>  			  (and filename (file-relative-name filename))))
> -    current-prefix-arg
> +    nil
>      shell-command-default-error-buffer))
>    (unless (string-match "&[ \t]*\\'" command)
>      (setq command (concat command " &")))
> +  (when (and output-buffer (numberp output-buffer))
> +    (error "Invalid output buffer"))
>    (shell-command command output-buffer error-buffer))

Thanks, but I don't understand why we need the error message.  Isn't
it enough to pass nil as 2nd argument to shell-command?