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.