grammars. The Info manual "(elisp) Parsing Expression Grammars" has
documentation and examples.
+** New major mode 'shell-command-mode'.
+This mode is used by default for the output of 'async-shell-command'.
+To revert to the previous behavior, set the (also new) variable
+'async-shell-command-mode' to 'shell-mode'. Any hooks or mode-specific
+variables used should be adapted appropriately.
\f
* Incompatible Lisp Changes in Emacs 30.1
;; Display output.
(with-current-buffer output-buffer
(setq mode-line-process '(":%s"))
- (unless (eq major-mode 'shell-mode)
- (shell-mode))
+ (cond
+ ((boundp 'async-shell-command-mode)
+ ;; Emacs 30+
+ (unless (eq major-mode async-shell-command-mode)
+ (funcall async-shell-command-mode)))
+ ((not (eq major-mode 'shell-mode))
+ (shell-mode)))
(set-process-filter p #'comint-output-filter)
(set-process-sentinel p #'shell-command-sentinel)
(when error-file
(with-current-buffer buf
(insert (format "\nProcess %s %s\n" process event))))))
+(define-derived-mode shell-command-mode comint-mode "Shell"
+ "Major mode for the output of asynchronous `shell-command'."
+ (setq-local font-lock-defaults '(shell-font-lock-keywords t))
+ ;; See comments in `shell-mode'.
+ (setq-local ansi-color-apply-face-function #'shell-apply-ansi-color)
+ (setq list-buffers-directory (expand-file-name default-directory)))
+
;;;###autoload
(defun shell (&optional buffer file-name)
"Run an inferior shell, with I/O through BUFFER (which defaults to `*shell*').
(eval-when-compile (require 'cl-lib))
(declare-function widget-convert "wid-edit" (type &rest args))
-(declare-function shell-mode "shell" ())
;;; From compile.el
(defvar compilation-current-error)
The output appears in OUTPUT-BUFFER, which could be a buffer or
the name of a buffer, and defaults to `shell-command-buffer-name-async'
-if nil or omitted. That buffer is in shell mode. Note that, unlike
-with `shell-command', OUTPUT-BUFFER can only be a buffer, a buffer's
-name (a string), or nil.
+if nil or omitted. That buffer is in major mode specified by the
+variable `async-shell-command-mode'. Note that, unlike with
+`shell-command', OUTPUT-BUFFER can only be a buffer, a buffer's name
+(a string), or nil.
You can customize `async-shell-command-buffer' to specify what to do
when the buffer specified by `shell-command-buffer-name-async' is
(declare-function comint-output-filter "comint" (process string))
(declare-function comint-term-environment "comint" ())
+(defvar async-shell-command-mode 'shell-command-mode
+ "Major mode to use for the output of asynchronous `shell-command'.")
+
(defun shell-command (command &optional output-buffer error-buffer)
"Execute string COMMAND in inferior shell; display output, if any.
With prefix argument, insert the COMMAND's output at point.
If COMMAND ends in `&', execute it asynchronously.
The output appears in the buffer whose name is specified
-by `shell-command-buffer-name-async'. That buffer is in shell
-mode. You can also use `async-shell-command' that automatically
-adds `&'.
+by `shell-command-buffer-name-async'. That buffer is in major mode
+specified by the variable `async-shell-command-mode'. You can also use
+`async-shell-command' that automatically adds `&'.
Otherwise, COMMAND is executed synchronously. The output appears in
the buffer named by `shell-command-buffer-name'. If the output is
(setq proc
(start-process-shell-command "Shell" buffer command)))
(setq mode-line-process '(":%s"))
- (shell-mode)
+ (funcall async-shell-command-mode)
(setq-local revert-buffer-function
(lambda (&rest _)
(async-shell-command command buffer)))