Subject: bug#79463: [PATCH] term: Add 'term-other-window' command

From: ERIC Frederickson <[email-masked]>
Date: Thu, 18 Sep 2025 13:09:21 -0500

>> I think that the functionality of having a terminal emulator pop to
>> another window can be extremely useful to those who use a terminal
>> emulator within their text editor, and would hence be a great thing to
>> ship with Emacs's built-in 'term' package. Additionally, I think that
>> this addition would be especially useful to people coming to Emacs from
>> other text/code editing environments such as VS Code, wherein the
>> "pop-up terminal" / "split terminal" workflow is very widely used and is
>> seen as standard.

> It's a no-brainer to have a command that does something we already do,
> but in another window.  However, please note that Emacs 31 is already
> capable to do this generically with many/most commands, by using the
> "C-x 4 4" prefix.  Thus, "C-x 4 4 M-x term RET" already does what you
> want, and I'm therefore wondering whether we need a new command for
> this, let alone a new keybinding "C-x 4 t".

Yes; the "C-x 4 4 M-x term RET" solution is something I found while
exploring the 'term-other-window' idea, and it led me to question
whether a new command like 'term-other-window' was necessary.  I came to
the conclusion that the existence of a stand-alone 'term-other-window'
command would still be beneficial, because it would enable users to bind
the "Term mode buffer in another window" behavior to a key without
needing to write a custom command to bind the key to.  I think it'd be
nice if they could make a binding for this behavior via
"M-x global-set-key RET" for example, especially since this is a behavior
that I've seen to be widely used among programmers.  I'd be worried
about a situation where a user thinks:

  "I like what 'C-x 4 4 M-x term RET' does, and would like to bind that
  to a more convenient key",

and then can't find a way to do so.

Of course, this argument could apply to any command that someone might
want to run after "C-x 4 4", and clearly we should not add a
'*-other-window' variant for any command '*' for which it may be wanted.
However, I feel it's a justified addition to the 'term' package
specifically because the "terminal emulator in another window" behavior
is a common pattern of interaction for terminal emulator users, and
making it more discoverable and more easily bindable via adding a
command like 'term-other-window' seems to make 'term' more friendly.

> I'm writing some comments below, both for the case we decide to accept
> this patch nonetheless, and for making you aware of our conventions
> for your future contributions.

Awesome, thank you very much for providing this feedback.

>> +*** New command 'term-other-window'.
>> +This command is like 'term', but opens the resulting Term mode buffer in
>> +another window. With the addition of this command, Emacs now gives users
>> +an out-of-the-box way to use the common "pop-up terminal" workflow that
>> +many users may be expecting, especially if they're coming from other
>> +popular text editing environments in which this workflow is standard.

> Our conventions are to leave two spaces between sentences.

Adopted.

> Also, the second sentence seems to be unnecessary, because NEWS
> doesn't have to advertise new features, as long as the functionality
> is clear.

Understood.

>> +;;;###autoload
>> +(defun term-other-window (program)
>> +  "Start a terminal-emulator in a new buffer, in another window.
>> +The buffer is in Term mode; see `term-mode' for the
>> +commands to use in that buffer.
>> +
>> +\\<term-raw-map>Type \\[other-window] to switch back to another window,
>> +or \\[switch-to-buffer] to switch to another buffer."
>> +  (interactive (list (read-shell-command "Run program in other window: "
>> +                     (or explicit-shell-file-name
>> +                         (getenv "ESHELL")
>> +                         shell-file-name))))
>> +  (let ((prog (split-string-shell-command program)))
>> +    (set-buffer (apply #'make-term "terminal" (car prog) nil (cdr prog))))
>> +  (term-char-mode)
>> +  (pop-to-buffer "*terminal*"))

> Since this is almost an exact copy of 'term', maybe making them both
> use the same subroutine with most of the body would be slightly
> better.  E.g., what if someone wants to add term-other-frame?

Agreed; will do.

I'll take some time to think about the best way to proceed here, and I
hope to send an improved patch within a few days.  I'll assume that it
would be best to send this updated patch to this same thread, unless I
hear otherwise.

Thanks everyone,
And thanks again Eli for your comments,
--
Eric Frederickson

On Thu, Sep 18, 2025 at 12:35 AM Eli Zaretskii <[email-masked]> wrote:
>
> > Cc: [email-masked], [email-masked]
> > From: ERIC Frederickson <[email-masked]>
> > Date: Wed, 17 Sep 2025 20:41:50 -0500
> >
> > The patch attached to this message adds a command to lisp/term.el called
> > 'term-other-window', which is a sibling command to 'term' but which
> > opens the *terminal* buffer in another window.
>
> Thanks.
>
> > I think that the functionality of having a terminal emulator pop to
> > another window can be extremely useful to those who use a terminal
> > emulator within their text editor, and would hence be a great thing to
> > ship with Emacs's built-in 'term' package. Additionally, I think that
> > this addition would be especially useful to people coming to Emacs from
> > other text/code editing environments such as VS Code, wherein the
> > "pop-up terminal" / "split terminal" workflow is very widely used and is
> > seen as standard.
>
> It's a no-brainer to have a command that does something we already do,
> but in another window.  However, please note that Emacs 31 is already
> capable to do this generically with many/most commands, by using the
> "C-x 4 4" prefix.  Thus, "C-x 4 4 M-x term RET" already does what you
> want, and I'm therefore wondering whether we need a new command for
> this, let alone a new keybinding "C-x 4 t".
>
> I'm writing some comments below, both for the case we decide to accept
> this patch nonetheless, and for making you aware of our conventions
> for your future contributions.
>
> > +*** New command 'term-other-window'.
> > +This command is like 'term', but opens the resulting Term mode buffer in
> > +another window. With the addition of this command, Emacs now gives users
> > +an out-of-the-box way to use the common "pop-up terminal" workflow that
> > +many users may be expecting, especially if they're coming from other
> > +popular text editing environments in which this workflow is standard.
>
> Our conventions are to leave two spaces between sentences.  Also, the
> second sentence seems to be unnecessary, because NEWS doesn't have to
> advertise new features, as long as the functionality is clear.
>
> > +;;;###autoload
> > +(defun term-other-window (program)
> > +  "Start a terminal-emulator in a new buffer, in another window.
> > +The buffer is in Term mode; see `term-mode' for the
> > +commands to use in that buffer.
> > +
> > +\\<term-raw-map>Type \\[other-window] to switch back to another window,
> > +or \\[switch-to-buffer] to switch to another buffer."
> > +  (interactive (list (read-shell-command "Run program in other window: "
> > +                                      (or explicit-shell-file-name
> > +                                          (getenv "ESHELL")
> > +                                          shell-file-name))))
> > +  (let ((prog (split-string-shell-command program)))
> > +    (set-buffer (apply #'make-term "terminal" (car prog) nil (cdr prog))))
> > +  (term-char-mode)
> > +  (pop-to-buffer "*terminal*"))
>
> Since this is almost an exact copy of 'term', maybe making them both
> use the same subroutine with most of the body would be slightly
> better.  E.g., what if someone wants to add term-other-frame?