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
Here’s a good breakdown of the different bundled shells and terminals for Emacs, from dumbest to most Emacs-y.
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
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)to the shell (see above for what the default value is).
(term-escape-char) <anything-else>is like doing equates to
C-x <anything-else>in normal Emacs.
(term-escape-char) C-jswitches 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-kswitches 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
; 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
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-n access the history, while
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
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.