A summary of Emacs’ bundled shell and terminal modes
This is based on a post on reddit, published on 2013-04-09.
Emacs comes bundled with a few different shell and terminal modes. It
can be hard to keep them straight. What’s the difference between
M-x term
and M-x ansi-term
?
Here’s a good breakdown of the different bundled shells and terminals for Emacs, from dumbest to most Emacs-y.
term-mode
Your VT100-esque terminal emulator; it does what most terminal
programs do. Ncurses-things work OK, but dumping large amounts of text
can be slow. By default it asks you which shell to run, defaulting to
the environmental variable $SHELL
(/bin/bash
for me). There are two modes of operation:
- char mode: Keys are sent immediately to the shell (including keys
that are normally Emacs keystrokes), with the following exceptions:
(term-escape-char) (term-escape-char)
sends(term-escape-char)
to the shell (see above for what the default value is).(term-escape-char) <anything-else>
is like doing equates toC-x <anything-else>
in normal Emacs.(term-escape-char) C-j
switches to line mode.
- line mode: Editing is done like in a normal Emacs buffer,
<enter>
sends the current line to the shell. This is useful for working with a program’s output.C-c C-k
switches to char mode.
This mode is activated with
; Creates or switches to an existing "*terminal*" buffer.
; The default 'term-escape-char' is "C-c"
M-x term
or
; Creates a new "*ansi-term*" or "*ansi-term*<n>" buffer.
; The default 'term-escape-char' is "C-c" and "C-x"
M-x ansi-term
shell-mode
The name is a misnomer; shell-mode is a terminal emulator, not a
shell; it’s called that because it is used for running a shell (bash,
zsh, …). The idea of this mode is to use an external shell, but make it
Emacs-y. History is not handled by the shell, but by Emacs;
M-p
and M-n
access the history, while
arrows/C-p
/C-n
move the point (which is is
consistent with other Emacs REPL-type interfaces). It ignores VT100-type
terminal colors, and colorizes things itself (it inspects words to see
if they are directories, in the case of ls
). This has the
benefit that it does syntax highlighting on the currently being typed
command. Ncurses programs will of course not work. This mode is
activated with:
M-x shell
eshell-mode
This is a shell+terminal, entirely written in Emacs lisp.
(Interestingly, it doesn’t set $SHELL
, so that will be
whatever it was when you launched Emacs). This won’t even be running zsh
or bash, it will be running “esh”, part of Emacs.