Luke Shumaker » blog » emacs-shells

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.


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:

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-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


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.