From: Tino Calancha <tino.calancha@gmail.com>
To: 39138@debbugs.gnu.org
Subject: bug#39138: 28.0.50; Add variables for shell command output buffer names
Date: Tue, 14 Jan 2020 22:31:34 +0100 [thread overview]
Message-ID: <878sm9u3m1.fsf@calancha-pc.dy.bbexcite.jp> (raw)
Severity: wishlist
IMO, the two strings, `*Shell Command Output*' and
`*Async Shell Command*', deserve variables with their docstrings.
--8<-----------------------------cut here---------------start------------->8---
commit 4a436b46621f0c0016c1a374a3c22dff0be39391
Author: Tino Calancha <tino.calancha@gmail.com>
Date: Tue Jan 14 22:28:22 2020 +0100
Add variables for shell command output buffer names
Buffers `*Shell Command Output*' and `*Async Shell Command*'
have been around since a long time; used across several libraries,
they are de facto output buffers for shell commands.
* lisp/simple.el (shell-command-buffer-name)
(shell-command-buffer-name-async): New variables.
* lisp/dired-aux.el
* lisp/gnus/gnus-sum.el
* lisp/gnus/gnus-win.el
* lisp/ibuf-ext.el
* lisp/net/tramp.el: Use them.
* etc/NEWS (Changes in Emacs 28.1): Announce this change.
* doc/emacs/misc.texi (Single Shell)
* doc/misc/tramp.texi (Remote processes):
Update manual.
diff --git a/doc/emacs/misc.texi b/doc/emacs/misc.texi
index ab3318c4a2..3d443e5d2f 100644
--- a/doc/emacs/misc.texi
+++ b/doc/emacs/misc.texi
@@ -724,13 +724,15 @@ Single Shell
@kindex M-!
@findex shell-command
+@vindex shell-command-buffer-name
@kbd{M-!} (@code{shell-command}) reads a line of text using the
minibuffer and executes it as a shell command, in a subshell made just
for that command. Standard input for the command comes from the null
device. If the shell command produces any output, the output appears
-either in the echo area (if it is short), or in an Emacs buffer named
-@file{*Shell Command Output*}, displayed in another window (if the
-output is long). The variables @code{resize-mini-windows} and
+either in the echo area (if it is short), or in an Emacs buffer,
+displayed in another window (if the output is long). The name of
+this buffer is stored in the variable @code{shell-command-buffer-name}.
+The variables @code{resize-mini-windows} and
@code{max-mini-window-height} (@pxref{Minibuffer Edit}) control when
Emacs should consider the output to be too long for the echo area.
@@ -757,15 +759,16 @@ Single Shell
@kindex M-&
@findex async-shell-command
+@vindex shell-command-buffer-name-async
A shell command that ends in @samp{&} is executed
@dfn{asynchronously}, and you can continue to use Emacs as it runs.
You can also type @kbd{M-&} (@code{async-shell-command}) to execute a
shell command asynchronously; this is exactly like calling @kbd{M-!}
with a trailing @samp{&}, except that you do not need the @samp{&}.
-The default output buffer for asynchronous shell commands is named
-@samp{*Async Shell Command*}. Emacs inserts the output into this
-buffer as it comes in, whether or not the buffer is visible in a
-window.
+The variable @code{shell-command-buffer-name-async} stores the name
+of the default output buffer for asynchronous shell commands.
+Emacs inserts the output into this buffer as it comes in,
+whether or not the buffer is visible in a window.
@vindex async-shell-command-buffer
If you want to run more than one asynchronous shell command at the
@@ -803,7 +806,7 @@ Single Shell
see what keys are in the buffer. If the buffer contains a GnuPG key,
type @kbd{C-x h M-| gpg @key{RET}} to feed the entire buffer contents
to @command{gpg}. This will output the list of keys to the
-@file{*Shell Command Output*} buffer.
+buffer named @code{shell-command-buffer-name}.
@vindex shell-file-name
The above commands use the shell specified by the variable
diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi
index 049b240b60..0d6efa4f3f 100644
--- a/doc/misc/tramp.texi
+++ b/doc/misc/tramp.texi
@@ -3213,7 +3213,7 @@ Remote processes
@end example
@command{tail} command outputs continuously to the local buffer,
-@file{*Async Shell Command*}
+named @code{shell-command-buffer-name-async}
@kbd{M-x auto-revert-tail-mode @key{RET}} runs similarly showing
continuous output.
diff --git a/etc/NEWS b/etc/NEWS
index d5a1d27267..aac80fd263 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -34,6 +34,11 @@ are found by 'configure'
\f
* Changes in Emacs 28.1
++++
+** The new variables 'shell-command-buffer-name' and
+'shell-command-buffer-name-async' store the default buffer names
+for the output of shell commands.
+
\f
* Editing Changes in Emacs 28.1
diff --git a/lisp/dired-aux.el b/lisp/dired-aux.el
index 0069c1744d..aaa2f797de 100644
--- a/lisp/dired-aux.el
+++ b/lisp/dired-aux.el
@@ -684,7 +684,7 @@ dired-do-async-shell-command
for each command to terminate before running the next command.
In shell syntax this means separating the individual commands with `;'.
-The output appears in the buffer `*Async Shell Command*'."
+The output appears in the buffer `shell-command-buffer-name-async'."
(interactive
(let ((files (dired-get-marked-files t current-prefix-arg nil nil t)))
(list
@@ -723,7 +723,7 @@ dired-do-shell-command
If COMMAND ends in `&', `;', or `;&', it is executed in the
background asynchronously, and the output appears in the buffer
-`*Async Shell Command*'. When operating on multiple files and COMMAND
+`shell-command-buffer-name-async'. When operating on multiple files and COMMAND
ends in `&', the shell command is executed on each file in parallel.
However, when COMMAND ends in `;' or `;&' then commands are executed
in the background on each file sequentially waiting for each command
@@ -731,7 +731,7 @@ dired-do-shell-command
`dired-do-async-shell-command' that automatically adds `&'.
Otherwise, COMMAND is executed synchronously, and the output
-appears in the buffer `*Shell Command Output*'.
+appears in the buffer `shell-command-buffer-name'.
This feature does not try to redisplay Dired buffers afterward, as
there's no telling what files COMMAND may have changed.
diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el
index a59e8b359d..f6c1ae7c73 100644
--- a/lisp/gnus/gnus-sum.el
+++ b/lisp/gnus/gnus-sum.el
@@ -12281,7 +12281,7 @@ gnus-summary-pipe-output
(interactive (gnus-interactive "P\ny"))
(require 'gnus-art)
(let* ((articles (gnus-summary-work-articles n))
- (result-buffer "*Shell Command Output*")
+ (result-buffer shell-command-buffer-name)
(all-headers (not (memq sym '(nil r))))
(gnus-save-all-headers (or all-headers gnus-save-all-headers))
(raw (eq sym 'r))
diff --git a/lisp/gnus/gnus-win.el b/lisp/gnus/gnus-win.el
index 36b2835036..baa3146e64 100644
--- a/lisp/gnus/gnus-win.el
+++ b/lisp/gnus/gnus-win.el
@@ -142,7 +142,7 @@ gnus-buffer-configuration
(pipe
(vertical 1.0
(summary 0.25 point)
- ("*Shell Command Output*" 1.0)))
+ (shell-command-buffer-name 1.0)))
(bug
(vertical 1.0
(if gnus-bug-create-help-buffer '("*Gnus Help Bug*" 0.5))
diff --git a/lisp/ibuf-ext.el b/lisp/ibuf-ext.el
index bfb9787a96..c9ca1f8742 100644
--- a/lisp/ibuf-ext.el
+++ b/lisp/ibuf-ext.el
@@ -504,7 +504,7 @@ ibuffer-backward-filter-group
(ibuffer-forward-line 0))
(defun ibuffer--maybe-erase-shell-cmd-output ()
- (let ((buf (get-buffer "*Shell Command Output*")))
+ (let ((buf (get-buffer shell-command-buffer-name)))
(when (and (buffer-live-p buf)
(not shell-command-dont-erase-buffer)
(not (zerop (buffer-size buf))))
@@ -517,7 +517,7 @@ shell-command-pipe
:opstring "Shell command executed on"
:before (ibuffer--maybe-erase-shell-cmd-output)
:modifier-p nil)
- (let ((out-buf (get-buffer-create "*Shell Command Output*")))
+ (let ((out-buf (get-buffer-create shell-command-buffer-name)))
(with-current-buffer out-buf (goto-char (point-max)))
(call-shell-region (point-min) (point-max)
command nil out-buf)))
@@ -542,7 +542,7 @@ shell-command-file
:modifier-p nil)
(let ((file (and (not (buffer-modified-p))
buffer-file-name))
- (out-buf (get-buffer-create "*Shell Command Output*")))
+ (out-buf (get-buffer-create shell-command-buffer-name)))
(unless (and file (file-exists-p file))
(setq file
(make-temp-file
diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index a7c9b34d29..51fa88653a 100644
--- a/lisp/net/tramp.el
+++ b/lisp/net/tramp.el
@@ -3658,8 +3658,8 @@ tramp-handle-shell-command
(current-buffer))
(t (get-buffer-create
(if asynchronous
- "*Async Shell Command*"
- "*Shell Command Output*")))))
+ shell-command-buffer-name-async
+ shell-command-buffer-name)))))
(error-buffer
(cond
((bufferp error-buffer) error-buffer)
diff --git a/lisp/simple.el b/lisp/simple.el
index f9f1efcc98..01cb7d0de8 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -3319,6 +3319,14 @@ undo-outer-limit-truncate
(setq buffer-undo-list nil)
t))
\f
+;;;; Shell commands
+
+(defvar shell-command-buffer-name "*Shell Command Output*"
+ "Name of the output buffer for shell commands.")
+
+(defvar shell-command-buffer-name-async "*Async Shell Command*"
+ "Name of the output buffer for asynchronous shell commands.")
+
(defvar shell-command-history nil
"History list for some commands that read shell commands.
@@ -3383,7 +3391,7 @@ read-shell-command
(defcustom async-shell-command-buffer 'confirm-new-buffer
"What to do when the output buffer is used by another shell command.
This option specifies how to resolve the conflict where a new command
-wants to direct its output to the buffer `*Async Shell Command*',
+wants to direct its output to the buffer `shell-command-buffer-name-async',
but this buffer is already taken by another running shell command.
The value `confirm-kill-process' is used to ask for confirmation before
@@ -3510,14 +3518,14 @@ async-shell-command
Like `shell-command', but adds `&' at the end of COMMAND
to execute it asynchronously.
-The output appears in the buffer `*Async Shell Command*'.
+The output appears in the buffer `shell-command-buffer-name-async'.
That buffer is in shell mode.
You can configure `async-shell-command-buffer' to specify what to do
-when the `*Async Shell Command*' buffer is already taken by another
+when the `shell-command-buffer-name-async' buffer is already taken by another
running shell command. To run COMMAND without displaying the output
in a window you can configure `display-buffer-alist' to use the action
-`display-buffer-no-window' for the buffer `*Async Shell Command*'.
+`display-buffer-no-window' for the buffer `shell-command-buffer-name-async'.
In Elisp, you will often be better served by calling `start-process'
directly, since it offers more control and does not impose the use of
@@ -3553,12 +3561,12 @@ shell-command
directory in the prompt.
If COMMAND ends in `&', execute it asynchronously.
-The output appears in the buffer `*Async Shell Command*'.
+The output appears in the buffer `shell-command-buffer-name-async'.
That buffer is in shell mode. You can also use
`async-shell-command' that automatically adds `&'.
Otherwise, COMMAND is executed synchronously. The output appears in
-the buffer `*Shell Command Output*'. If the output is short enough to
+the buffer `shell-command-buffer-name'. If the output is short enough to
display in the echo area (which is determined by the variables
`resize-mini-windows' and `max-mini-window-height'), it is shown
there, but it is nonetheless available in buffer `*Shell Command
@@ -3672,7 +3680,7 @@ shell-command
(if (string-match "[ \t]*&[ \t]*\\'" command)
;; Command ending with ampersand means asynchronous.
(let* ((buffer (get-buffer-create
- (or output-buffer "*Async Shell Command*")))
+ (or output-buffer shell-command-buffer-name-async)))
(bname (buffer-name buffer))
(proc (get-buffer-process buffer))
(directory default-directory))
@@ -3824,7 +3832,7 @@ shell-command-on-region
error-buffer display-error-buffer
region-noncontiguous-p)
"Execute string COMMAND in inferior shell with region as input.
-Normally display output (if any) in temp buffer `*Shell Command Output*';
+Normally display output (if any) in temp buffer `shell-command-buffer-name';
Prefix arg means replace the region with it. Return the exit code of
COMMAND.
@@ -3843,7 +3851,7 @@ shell-command-on-region
If the output is short enough to display in the echo area
\(determined by the variable `max-mini-window-height' if
`resize-mini-windows' is non-nil), it is shown there.
-Otherwise it is displayed in the buffer `*Shell Command Output*'.
+Otherwise it is displayed in the buffer `shell-command-buffer-name'.
The output is available in that buffer in both cases.
If there is output and an error, a message about the error
@@ -3853,7 +3861,7 @@ shell-command-on-region
command's output. If the value is a buffer or buffer name,
erase that buffer and insert the output there; a non-nil value of
`shell-command-dont-erase-buffer' prevent to erase the buffer.
-If the value is nil, use the buffer `*Shell Command Output*'.
+If the value is nil, use the buffer `shell-command-buffer-name'.
Any other non-nil value means to insert the output in the
current buffer after START.
@@ -3921,7 +3929,7 @@ shell-command-on-region
(list t error-file)
t)))
;; It is rude to delete a buffer that the command is not using.
- ;; (let ((shell-buffer (get-buffer "*Shell Command Output*")))
+ ;; (let ((shell-buffer (get-buffer shell-command-buffer-name)))
;; (and shell-buffer (not (eq shell-buffer (current-buffer)))
;; (kill-buffer shell-buffer)))
;; Don't muck with mark unless REPLACE says we should.
@@ -3929,12 +3937,12 @@ shell-command-on-region
;; No prefix argument: put the output in a temp buffer,
;; replacing its entire contents.
(let ((buffer (get-buffer-create
- (or output-buffer "*Shell Command Output*"))))
+ (or output-buffer shell-command-buffer-name))))
(set-buffer-major-mode buffer) ; Enable globalized modes (bug#38111)
(unwind-protect
(if (and (eq buffer (current-buffer))
(or (not shell-command-dont-erase-buffer)
- (and (not (eq buffer (get-buffer "*Shell Command Output*")))
+ (and (not (eq buffer (get-buffer shell-command-buffer-name)))
(not (region-active-p)))))
;; If the input is the same buffer as the output,
;; delete everything but the specified region,
--8<-----------------------------cut here---------------end--------------->8---
In GNU Emacs 28.0.50 (build 3, x86_64-pc-linux-gnu, GTK+ Version 3.24.5, cairo version 1.16.0)
of 2020-01-14 built on calancha-pc.dy.bbexcite.jp
Repository revision: 06caa3b7e5e9fe91b6918f8567adbd5501d6dbdd
Repository branch: master
Windowing system distributor 'The X.Org Foundation', version 11.0.12004000
System Description: Debian GNU/Linux 10 (buster)
next reply other threads:[~2020-01-14 21:31 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-01-14 21:31 Tino Calancha [this message]
2020-01-14 22:43 ` bug#39138: 28.0.50; Add variables for shell command output buffer names Michael Albinus
2020-01-15 8:03 ` Robert Pluim
2020-01-15 16:11 ` Eli Zaretskii
2020-01-15 19:41 ` Tino Calancha
2020-01-15 23:09 ` Juri Linkov
2020-02-25 13:12 ` Michael Albinus
2020-05-19 4:08 ` Stefan Kangas
2020-05-19 14:09 ` Eli Zaretskii
2020-05-19 14:16 ` Stefan Kangas
2020-05-19 15:26 ` Tino Calancha
2020-08-09 12:19 ` Lars Ingebrigtsen
2020-08-09 23:18 ` Juri Linkov
2020-08-10 10:45 ` Lars Ingebrigtsen
2020-08-10 23:59 ` Juri Linkov
2020-08-11 11:16 ` Lars Ingebrigtsen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=878sm9u3m1.fsf@calancha-pc.dy.bbexcite.jp \
--to=tino.calancha@gmail.com \
--cc=39138@debbugs.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).