Follow Techotopia on Twitter

On-line Guides
All Guides
eBook Store
iOS / Android
Linux for Beginners
Office Productivity
Linux Installation
Linux Security
Linux Utilities
Linux Virtualization
Linux Kernel
System/Network Admin
Scripting Languages
Development Tools
Web Development
GUI Toolkits/Desktop
Mail Systems
Eclipse Documentation

How To Guides
General System Admin
Linux Security
Linux Filesystems
Web Servers
Graphics & Desktop
PC Hardware
Problem Solutions
Privacy Policy




Next: , Previous: Interactive Shell, Up: Shell

41.3 Shell Mode

Shell buffers use Shell mode, which defines several special keys attached to the C-c prefix. They are chosen to resemble the usual editing and job control characters present in shells that are not under Emacs, except that you must type C-c first. Here is a complete list of the special key bindings of Shell mode:

At end of buffer send line as input; otherwise, copy current line to end of buffer and send it (comint-send-input). When a line is copied, any prompt at the beginning of the line (text output by programs preceding your input) is omitted. See Shell Prompts, for how Shell mode recognizes prompts.
Complete the command name or file name before point in the shell buffer (comint-dynamic-complete). <TAB> also completes history references (see History References) and environment variable names.

The variable shell-completion-fignore specifies a list of file name extensions to ignore in Shell mode completion. The default setting is nil, but some users prefer ("~" "#" "%") to ignore file names ending in ‘~’, ‘#’ or ‘%’. Other related Comint modes use the variable comint-completion-fignore instead.

Display temporarily a list of the possible completions of the file name before point in the shell buffer (comint-dynamic-list-filename-completions).
Either delete a character or send EOF (comint-delchar-or-maybe-eof). Typed at the end of the shell buffer, C-d sends EOF to the subshell. Typed at any other position in the buffer, C-d deletes a character as usual.
C-c C-a
Move to the beginning of the line, but after the prompt if any (comint-bol-or-process-mark). If you repeat this command twice in a row, the second time it moves back to the process mark, which is the beginning of the input that you have not yet sent to the subshell. (Normally that is the same place—the end of the prompt on this line—but after C-c <SPC> the process mark may be in a previous line.)
C-c <SPC>
Accumulate multiple lines of input, then send them together. This command inserts a newline before point, but does not send the preceding text as input to the subshell—at least, not yet. Both lines, the one before this newline and the one after, will be sent together (along with the newline that separates them), when you type <RET>.
C-c C-u
Kill all text pending at end of buffer to be sent as input (comint-kill-input). If point is not at end of buffer, this only kills the part of this text that precedes point.
C-c C-w
Kill a word before point (backward-kill-word).
C-c C-c
Interrupt the shell or its current subjob if any (comint-interrupt-subjob). This command also kills any shell input pending in the shell buffer and not yet sent.
C-c C-z
Stop the shell or its current subjob if any (comint-stop-subjob). This command also kills any shell input pending in the shell buffer and not yet sent.
C-c C-\
Send quit signal to the shell or its current subjob if any (comint-quit-subjob). This command also kills any shell input pending in the shell buffer and not yet sent.
C-c C-o
Delete the last batch of output from a shell command (comint-delete-output). This is useful if a shell command spews out lots of output that just gets in the way. This command used to be called comint-kill-output.
C-c C-s
Write the last batch of output from a shell command to a file (comint-write-output). With a prefix argument, the file is appended to instead. Any prompt at the end of the output is not written.
C-c C-r
Scroll to display the beginning of the last batch of output at the top of the window; also move the cursor there (comint-show-output).
C-c C-e
Scroll to put the end of the buffer at the bottom of the window (comint-show-maximum-output).
C-c C-f
Move forward across one shell command, but not beyond the current line (shell-forward-command). The variable shell-command-regexp specifies how to recognize the end of a command.
C-c C-b
Move backward across one shell command, but not beyond the current line (shell-backward-command).
M-x dirs
Ask the shell what its current directory is, so that Emacs can agree with the shell.
M-x send-invisible <RET> text <RET>
Send text as input to the shell, after reading it without echoing. This is useful when a shell command runs a program that asks for a password.

Please note that Emacs will not echo passwords by default. If you really want them to be echoed, evaluate the following Lisp expression:

          (remove-hook 'comint-output-filter-functions

M-x comint-continue-subjob
Continue the shell process. This is useful if you accidentally suspend the shell process.1
M-x comint-strip-ctrl-m
Discard all control-M characters from the current group of shell output. The most convenient way to use this command is to make it run automatically when you get output from the subshell. To do that, evaluate this Lisp expression:
          (add-hook 'comint-output-filter-functions

M-x comint-truncate-buffer
This command truncates the shell buffer to a certain maximum number of lines, specified by the variable comint-buffer-maximum-size. Here's how to do this automatically each time you get output from the subshell:
          (add-hook 'comint-output-filter-functions

Shell mode is a derivative of Comint mode, a general-purpose mode for communicating with interactive subprocesses. Most of the features of Shell mode actually come from Comint mode, as you can see from the command names listed above. The special features of Shell mode include the directory tracking feature, and a few user commands.

Other Emacs features that use variants of Comint mode include GUD (see Debuggers) and M-x run-lisp (see External Lisp).

You can use M-x comint-run to execute any program of your choice in a subprocess using unmodified Comint mode—without the specializations of Shell mode.


[1] You should not suspend the shell process. Suspending a subjob of the shell is a completely different matter—that is normal practice, but you must use the shell to continue the subjob; this command won't do it.

  Published under the terms of the GNU General Public License Design by Interspire