Key sequences longer than one key (and some single-key sequences) are
written inside quotes or on lines by themselves, like this:
4 History of Emacs
4.1 Where does the name “Emacs” come from?
Emacs originally was an acronym for Editor MACroS. RMS says he “picked
the name Emacs because E was not in use as an abbreviation on ITS at
the time.” The first Emacs was a set of macros written in 1976 at MIT
by RMS for the editor TECO (Text Editor and COrrector, originally Tape
Editor and COrrector) under ITS (the Incompatible Timesharing System) on
a PDP-10. RMS had already extended TECO with a “real-time”
full-screen mode with reprogrammable keys. Emacs was started by
Guy Steele as a project to unify the many
divergent TECO command sets and key bindings at MIT, and completed by
RMS.
Many people have said that TECO code looks a lot like line noise; you
can read more on
Wikipedia.
Someone has written a TECO implementation in Emacs Lisp (to find it,
see Where can I get Emacs Lisp packages that don’t come with Emacs?); it would be an
interesting project to run the original TECO Emacs inside of Emacs.
For some not-so-serious alternative reasons for Emacs to have that
name, check out the file etc/JOKES (see What are src/config.h, site-lisp/default.el, etc.?).
4.2 What is the latest version of Emacs?
Emacs 29.1.90 is the current version as of this writing. A version
number with two components (e.g., ‘28.1’) indicates a released
version; three components indicate a development
version (e.g., ‘29.0.50’ is what will eventually become ‘29.1’).
Emacs is under active development, hosted at
Savannah.
Follow the instructions given there to clone the project repository.
Because Emacs undergoes many changes before a release, the version
number of a development version is not especially meaningful. It is
better to refer to the date on which the sources were retrieved from the
development repository. The development version is usually quite robust
for every-day use, but if stability is more important to you than the
latest features, you may want to stick to the releases.
The following sections list some of the major new features in the last
few Emacs releases. For full details of the changes in any version of
Emacs, type C-h C-n (M-x view-emacs-news). You can give
this command a prefix argument to read about which features were new
in older versions.
4.3 What is different about Emacs 29?
Here’s a list of the most important changes in Emacs 29 as compared to
Emacs 28 (the full list is too long, and can be read in the Emacs
NEWS file by typing C-h n inside Emacs).
- Emacs can now be built with the
tree-sitter
library, which provides incremental parsing capabilities for several
programming languages. Emacs comes with several major modes which use
this library for syntax highlighting (a.k.a. “fontification”),
indentation, Imenu support, etc. These modes have names
lang-ts-mode
, where lang is the programming
language. For example, c-ts-mode
, ruby-ts-mode
, etc.
There are several new font-lock faces, such as
font-lock-number-face
and font-lock-operator-face
,
intended to be used with these modes.
- Emacs can now be built in the PGTK (“pure GTK”) configuration, which
supports running Emacs on window systems other than X, such as Wayland
and Broadway.
- Emacs now has built-in support for accessing SQLite databases. This
requires Emacs to be built with the optional sqlite3 library.
- Emacs comes with the popular
use-package
package bundled.
- Emacs can now display WebP images, if it was built with the optional
libwebp library.
- On X window system, Emacs now supports the XInput2 specification for
input events.
- Emacs now comes with a client library for using Language Server
Protocol (LSP) servers. This library, named eglot.el
(the name stands for “Emacs polyGlot”) provides LSP support for
various software development and maintenance features, such as
xref
, Imenu, ElDoc, etc.
- Emacs can now cope with files with very long lines much better. It no
longer hangs when displaying such long lines, and allows
reasonably-responsive editing when such lines are present in the
visible portion of a buffer.
- Emacs now supports the latest version 15.0 of the Unicode Standard.
- The new mode
pixel-scroll-precision-mode
allows precise and
smooth scrolling of the display at pixel resolution, if your mouse
supports this.
- Emacs now supports 24-bit true colors on more terminals.
- On capable X terminal emulators, Emacs now supports setting the X
primary selection on TTY frames.
- New convenient commands are now available for inserting, searching,
listing, and describing Emoji. These commands are on the C-x 8 e prefix key. The commands C-u C-x =
(
what-cursor-position
) and M-x describe-char now show the
names of Emoji sequences at point.
- The Help commands were enhanced:
- - M-x apropos-variable shows the values of the matching variables.
- - C-h b activates
outline-minor-mode
in the buffer, which
makes it easier to browse long lists of key bindings.
- - I in the *Help* buffer displays the corresponding
documentation in the Emacs Lisp Reference manual.
- - New command
help-quick
displays a buffer with overview of
common Help commands.
- Outline Minor mode uses buttons to hide and show outlines.
- Deleted frames can now be undeleted using C-x 5 u, if the
optional
undelete-frame-mode
is enabled.
- You can now delete the entire composed sequence of characters with
Delete and edits the composed sequence by turning on the
composition-break-at-point
option.
- Support is added for many old scripts and writing systems, such as Tai
Tham, Brahmi, Tirhuta, Modi, Lepcha, and many others.
- New translations of the Emacs tutorial: Ukrainian and Greek.
- New major modes for Typescript, Csharp, CMake, Go, Rust, and Yaml.
4.4 What is different about Emacs 28?
Emacs 28 has too many new features and changes to list all of them
here. We list below a small selection; consult the Emacs NEWS
file (C-h n) for the full list of changes in Emacs 28.
-
Emacs now optionally supports native compilation of Lisp files. This
can improves performance significantly in some cases. To enable this,
configure Emacs with the --with-native-compilation option.
- The new NonGNU ELPA archive is enabled by default alongside GNU ELPA.
Thus, packages on NonGNU ELPA will appear by default in the list shown
by the
list-packages
command.
- The Cairo graphics library is now used by default if present.
- On GNU/Linux, Emacs now supports loading Secure Computing filters. To
use this feature, invoke Emacs with the --seccomp=file
command-line switch, where file names a binary file that defines
the filtering. See the manual page of the
seccomp
system call
for more details.
- The new themes ‘modus-vivendi’ and ‘modus-operandi’ have
been added. They are designed to conform with the highest standard
for color-contrast accessibility (WCAG AAA).
- On capable systems, Emacs now correctly displays Emoji and Emoji
sequences by default, provided that a suitable font is available.
- New system for displaying documentation for groups of functions
(M-x shortdoc-display-group RET).
- Emacs can now support 24-bit color text-mode terminals even if their
terminfo database doesn’t state this support in a standard way. Set
the
COLORTERM
environment variable to the value ‘truecolor’
to activate this.
- The
strike-through
face attribute is now supported on capable
text-mode terminals.
-
xterm-mouse-mode
supports TTY menus.
- A new minor mode
context-menu-mode
causes mouse-3
(a.k.a. “right-clicks”) of the mouse to pop up context-dependent
menus.
- Prefix commands to control the display of the results of the next
command. C-x 4 4 command displays the result of
command in a new window. C-x 5 5 command displays
the results of command in a new frame.
- Emacs now supports “transient” input methods. A transient input
method is enabled for inserting a single character, and is then
automatically disabled. Select a transient input method with C-u
C-x \; enable it (for inserting a single character) with C-x \.
New input methods
compose
(based on X Window System Multi_key
sequences) and iso-transl
are especially convenient with this
feature, when you need to insert a single special character.
- M-y, when invoked after a command that is not a yank command,
allows selection of one of the previous kills.
- New minor mode
repeat-mode
allows to repeat commands with fewer
keystrokes.
- Among the many internal changes in this release, we would like to
highlight that all files in the tree now use
lexical-binding
.
4.5 What is different about Emacs 27?
-
Emacs now uses the GNU Multiple Precision (GMP) library to
support integers whose size is too large to support natively. The
integers supported natively are known as “fixnums”, while the larger
ones are “bignums”. All the arithmetic, comparison, and logical
(also known as “bitwise”) operations where bignums make sense now
support both fixnums and bignums.
-
Emacs now uses HarfBuzz as its default shaping engine.
-
Native support for JSON parsing that is much faster than
json.el.
- Cairo drawing is no longer experimental.
-
Emacs now uses a “portable dumper” instead of unexec. This improves
compatibility with memory allocation on modern systems, and in
particular better supports the Address Space Layout Randomization
(ASLR) feature, a security technique used by most modern
operating systems.
-
Emacs can now use the XDG convention for init files.
-
Emacs can now be configured using an early init file. The primary
purpose is to allow customizing how the package system is initialized
given that initialization now happens before loading the regular init
file.
-
Built-in support for tabs (tab bar and tab line).
- Support for resizing and rotating of images without ImageMagick.
Consult the Emacs NEWS.27 file for the full list of changes in
Emacs 27.
4.6 What is different about Emacs 26?
-
Emacs now provides a limited form of concurrency with Lisp threads.
-
Emacs now supports
systemd
. The new command-line option
--fg-daemon is part of this support, it causes Emacs to run
in the foreground instead of forking, as under --daemon.
- Emacs now supports 24-bit true color on text terminals which provide
that feature. See How do I get colors and syntax highlighting on a TTY?.
-
Emacs on X now supports double-buffering, which eliminates display
flickering in most situations.
- You can now scroll the Emacs display horizontally using the mouse or
touchpad.
-
Emacs display now includes an optional feature for display of line
numbers via the
display-line-numbers-mode
command. This
feature is much faster than the equivalent display offered by packages
such as linum
, and also provides many optional features like
relative line numbers.
-
The automatic horizontal scrolling of the window display when lines
are truncated can now optionally be enabled only for the current line,
the line where Emacs shows the cursor. Under this mode, all the other
window lines are not scrolled to show characters outside of the
viewport.
- Letter-case conversions now honor special cases in Turkish and Greek
scripts.
-
Support for Enchant is now part of the Emacs spell-checking commands.
- Tramp now supports Google Drive filesystems.
- Emacs can now be built while omitting the details of the machine on
which it was built, thus making it easier to produce reproducible
builds.
- Security vulnerability related to Enriched Text mode is removed.
Enriched mode previously allowed saving
display
properties as
part of text; those properties support evaluating arbitrary Lisp code,
which opens a vulnerability for Emacs users receiving Enriched Text
from external sources. Execution of arbitrary Lisp forms in
display
properties decoded by Enriched Text mode is now
disabled by default.
-
Emacs 26.2 comes with data files imported from the latest Unicode
Standard version 11.0.0.
Consult the Emacs NEWS.26 file for the full list of changes in
Emacs 26.
4.7 What is different about Emacs 25?
-
Emacs can now embed native widgets inside Emacs buffers, if you have
gtk3 and webkitgtk3 installed. E.g., to access the embedded webkit
browser widget, type M-x xwidget-webkit-browse-url.
-
Emacs can now dynamically load external modules compiled as shared
libraries.
-
C-x 8 has new shorthands for several popular characters, type
C-x 8 C-h to list shorthands.
-
A new minor mode
global-eldoc-mode
is enabled by default, and
shows in the echo area or in the mode line the argument list of the
Emacs Lisp form at point.
-
On text terminals that support the “bracketed paste mode” Emacs now
uses that mode by default. This mode allows Emacs to distinguish
between pasted text and text typed by the user.
-
Emacs 25 comes with data files imported from the latest Unicode
Standard version 9.0.0.
-
The support for bidirectional editing was updated to include all the
features mandated by the latest Unicode Standard version 9.0.0.
-
Search command can now perform character folding in matches. This is
analogous to case folding, but instead of disregarding case variants,
it disregards wider classes of distinctions between similar
characters, such as matching different variants of double quote
characters, ignoring diacritics, etc.
-
The Emacs Web Browser EWW was extended to render text using
variable-pitch fonts, and got other new features.
-
Rmail can now render HTML mail messages, if Emacs is built with
libxml2 or if you have the Lynx browser installed.
-
VC now has basic support for
push
commands, implemented for
Bzr, Git, and Hg.
-
Hide-IfDef mode now support full C/C++ expressions in macros,
macro argument expansion, interactive macro evaluation and automatic
scanning of
#define
d symbols.
-
New package Xref replaces Etags’s front-end and UI. Xref provides a
generic framework and new commands to find and move to definitions of
functions, macros, data structures etc., as well as go back to the
location where you were before moving to a definition. It supersedes
and obsoletes many Etags commands, while still using the etags.el code
that reads the TAGS tables as one of its back-ends. As result, the
popular key bindings M-. and M-, have been changed to
invoke Xref commands.
-
The new package Project provides generic infrastructure for dealing
with projects.
-
Emacs can now draw horizontal scroll bars on some platforms that
provide toolkit scroll bars, namely Gtk+, Lucid, Motif and Windows.
Consult the Emacs NEWS.25 file for the full list of changes in
Emacs 25.
4.8 What is different about Emacs 24?
-
Emacs now includes a package manager. Type M-x list-packages to
get started. You can use this to download and automatically install
many more Lisp packages.
-
Emacs Lisp now supports lexical binding on a per-file basis. In
lexical binding, variable references must be located textually
within the binding construct. This contrasts with dynamic
binding, where programs can refer to variables defined outside their
local textual scope. A Lisp file can use a local variable setting of
lexical-binding: t
to indicate that the contents should be
interpreted using lexical binding. See the Emacs Lisp Reference
Manual for more details.
-
Some human languages, such as English, are written from left to right.
Others, such as Arabic, are written from right to left. Emacs now has
support for any mixture of these forms—this is “bidirectional text”.
- Handling of text selections has been improved, and now integrates
better with external clipboards.
-
A new command customize-themes allows you to easily change the
appearance of your Emacs.
- Emacs can be compiled with the GTK+ 3 toolkit.
- Support for several new external libraries can be included at compile
time:
- “Security-Enhanced Linux” (SELinux) is a Linux kernel feature that
provides more sophisticated file access controls than ordinary
“Unix-style” file permissions.
- The ImageMagick display library. This allows you to display many more
image format in Emacs, as well as carry out transformations such as
rotations.
- The GnuTLS library for secure network communications. Emacs uses this
transparently for email if your mail server supports it.
- The libxml2 library for parsing XML structures.
- Much more flexibility in the handling of windows and buffer display.
Consult the Emacs NEWS.24 file for the full list of changes in
Emacs 24.
4.9 What is different about Emacs 23?
-
Emacs has a new font code that can use multiple font backends,
including freetype and fontconfig. Emacs can use the Xft library for
anti-aliasing, and the otf and m17n libraries for complex text layout and
text shaping.
-
The Emacs character set is now a superset of Unicode. Several new
language environments have been added.
-
Emacs now supports using both X displays and ttys in the same session
(‘multi-tty’).
-
Emacs can be started as a daemon in the background.
-
There is a new NeXTstep port of Emacs. This supports GNUstep and Mac OS
X (via the Cocoa libraries). The Carbon port of Emacs, which supported
Mac OS X in Emacs 22, has been removed.
-
Directory-local variables can now be defined, in a similar manner to
file-local variables.
- Transient Mark mode is on by default.
Other changes include: support for serial port access; D-Bus bindings; a
new Visual Line mode for line-motion; improved completion; a new mode
(‘DocView’) for viewing of PDF, PostScript, and DVI documents; nXML
mode (for editing XML documents) is included; VC has been updated for
newer version control systems; etc.
Consult the Emacs NEWS.23 file for the full list of changes in
Emacs 23.
4.10 What is different about Emacs 22?
-
Emacs can be built with GTK+ widgets, and supports drag-and-drop
operation on X.
-
Emacs 22 features support for GNU/Linux systems on S390 and x86-64
machines, as well as support for the Mac OS X and Cygwin operating
systems.
- The native MS-Windows, and Mac OS X builds include full support
for images, toolbar, and tooltips.
- Font Lock mode, Auto Compression mode, and File Name Shadow Mode are
enabled by default.
- The maximum size of buffers is increased: on 32-bit machines, it is
256 MBytes for Emacs 23.1, and 512 MBytes for Emacs 23.2 and above.
- Links can be followed with mouse-1, in addition to mouse-2.
-
Mouse wheel support is enabled by default.
- Window fringes are customizable.
- The mode line of the selected window is now highlighted.
- The minibuffer prompt is displayed in a distinct face.
- Abbrev definitions are read automatically at startup.
- Grep mode is separate from Compilation mode and has many new options and
commands specific to grep.
- The original Emacs macro system has been replaced by the new Kmacro
package, which provides many new commands and features and a simple
interface that uses the function keys F3 and F4. Macros are stored in a
macro ring, and can be debugged and edited interactively.
- The Grand Unified Debugger (GUD) can be used with a full graphical user
interface to GDB; this provides many features found in traditional
development environments, making it easy to manipulate breakpoints, add
watch points, display the call stack, etc. Breakpoints are visually
indicated in the source buffer.
-
Many new modes and packages have been included in Emacs, such as Calc,
TRAMP, URL, IDO, CUA, ERC, rcirc, Table, Image-Dired, SES, Ruler, Org,
PGG, Flymake, Password, Printing, Reveal, wdired, t-mouse, longlines,
savehist, Conf mode, Python mode, DNS mode, etc.
-
Leim is now part of Emacs. Unicode support has been much improved, and
the following input methods have been added: belarusian, bulgarian-bds,
bulgarian-phonetic, chinese-sisheng, croatian, dutch, georgian,
latin-alt-postfix, latin-postfix, latin-prefix, latvian-keyboard,
lithuanian-numeric, lithuanian-keyboard, malayalam-inscript, rfc1345,
russian-computer, sgml, slovenian, tamil-inscript, ucs,
ukrainian-computer, vietnamese-telex, and welsh.
The following language environments have also been added: Belarusian,
Bulgarian, Chinese-EUC-TW, Croatian, French, Georgian, Italian, Latin-6,
Latin-7, Latvian, Lithuanian, Malayalam, Russian, Slovenian, Swedish,
Tajik, Tamil, UTF-8, Ukrainian, Welsh, and Windows-1255.
-
In addition, Emacs 22 now includes the Emacs Lisp Reference Manual
(see Where can I get documentation on Emacs Lisp?) and the Emacs Lisp Intro.
Consult the Emacs NEWS.22 file for the full list of changes in
Emacs 22.
4.11 What is different about Emacs 21?
Emacs 21 features a thorough rewrite of the display engine. The new
display engine supports variable-size fonts, images, and can play sounds
on platforms which support that. As a result, the visual appearance of
Emacs, when it runs on a windowed display, is much more reminiscent of
modern GUI programs, and includes 3D widgets (used for the mode line and
the scroll bars), a configurable and extensible toolbar, tooltips
(a.k.a. balloon help), and other niceties.
In addition, Emacs 21 supports faces on text-only terminals. This means
that you can now have colors when you run Emacs on a GNU/Linux console
and on xterm
with emacs -nw.
Consult the Emacs NEWS.21 file for the full list of changes in
Emacs 21.
4.12 What is different about Emacs 20?
The differences between Emacs versions 18 and 19 were rather dramatic;
the introduction of frames, faces, and colors on windowing systems was
obvious to even the most casual user.
There are differences between Emacs versions 19 and 20 as well, but many
are more subtle or harder to find. Among the changes are the inclusion
of MULE code for languages that use non-Latin characters and for mixing
several languages in the same document; the “Customize” facility for
modifying variables without having to use Lisp; and automatic conversion
of files from Macintosh, Microsoft, and Unix platforms.
Consult the Emacs NEWS.20 file for the full list of changes in
Emacs 20.
4.13 What was XEmacs?
XEmacs was a branch version of Emacs that is no longer actively
developed. Originally known as “Lucid Emacs”, XEmacs was forked
from a prerelease version of Emacs 19. XEmacs last released a new
version on January 30, 2009, which lacks many important features that
exist in Emacs. Since its development has stopped, we do not expect
to see any new releases.
In the past, it was not uncommon for Emacs packages to include code
for compatibility with XEmacs. Nowadays, most built-in and third party
packages have either stopped supporting XEmacs or were developed
exclusively for Emacs.
If you want to talk about these two versions and distinguish them,
please call them “Emacs” and “XEmacs.” To contrast “XEmacs”
with “GNU Emacs” would be misleading, since XEmacs too has its
origin in the work of the GNU Project. Terms such as “Emacsen” and
“(X)Emacs” are not wrong, but they are not very clear, so it
is better to write “Emacs and XEmacs.”
5 Common requests
5.1 How do I set up an init file properly?
When Emacs is started, it normally tries to load a Lisp program from
an initialization file, or init file for short. This
file, if it exists, specifies how to initialize Emacs for you.
Traditionally, file ~/.emacs is used as the init file, although
Emacs also looks at ~/.emacs.el, ~/.emacs.d/init.el,
~/.config/emacs/init.el, or other locations.
See Init File in The GNU Emacs Manual.
Emacs includes the Customize facility (see How do I start using Customize?). This
allows users who are unfamiliar with Emacs Lisp to modify their
init files in a relatively straightforward way, using menus
rather than Lisp code.
While Customize might indeed make it easier to configure Emacs,
consider taking a bit of time to learn Emacs Lisp and modifying your
init file directly. Simple configuration options are described
rather completely in Init File in The GNU Emacs Manual,
for users interested in performing frequently requested, basic tasks.
In general, new Emacs users should not be provided with init
files, because this can cause confusing non-standard behavior. Then
they send questions to
the help-gnu-emacs mailing list asking why Emacs
isn’t behaving as documented.
5.2 How do I start using Customize?
The main Customize entry point is M-x customize RET. This
command takes you to a buffer listing all the available Customize
groups. From there, you can access all customizable options and faces,
change their values, and save your changes to your init file.
See Easy Customization in The GNU Emacs Manual.
If you know the name of the group in advance (e.g., “shell”), use
M-x customize-group RET.
If you wish to customize a single option, use M-x customize-option
RET. This command prompts you for the name of the option to
customize, with completion.
5.3 How do I get colors and syntax highlighting on a TTY?
Colors and faces are supported in non-windowed mode, i.e., on Unix and
GNU/Linux text-only terminals and consoles, and when invoked as
‘emacs -nw’ on X, MS-DOS and MS-Windows. Emacs automatically
detects color support at startup and uses it if available. If you
think that your terminal supports colors, but Emacs won’t use them,
check the termcap
entry for your display type for color-related
capabilities.
The command M-x list-colors-display pops up a window which
exhibits all the colors Emacs knows about on the current display.
Syntax highlighting is also on by default on text-only terminals.
Emacs 26.1 and later support direct color mode in terminals. If Emacs
finds Terminfo capabilities ‘setb24’ and ‘setf24’, 24-bit
direct color mode is used. The capability strings are expected to
take one 24-bit pixel value as argument and transform the pixel to a
string that can be used to send 24-bit colors to the terminal.
Standard terminal definitions don’t support these capabilities and
therefore custom definition is needed.
$ cat terminfo-custom.src
xterm-emacs|xterm with 24-bit direct color mode for Emacs,
use=xterm-256color,
setb24=\E[48\:2\:\:%p1%{65536}%/%d\:%p1%{256}%/%{255}%&\
%d\:%p1%{255}%&%dm,
setf24=\E[38\:2\:\:%p1%{65536}%/%d\:%p1%{256}%/%{255}%&\
%d\:%p1%{255}%&%dm,
$ tic -x -o ~/.terminfo terminfo-custom.src
$ TERM=xterm-emacs emacs -nw
Emacs 27.1 and later support Terminfo capability ‘RGB’ for
detecting 24-bit direct color mode. Multiple standard terminal
definitions support this capability.
$ TERM=xterm-direct infocmp | grep seta[bf]
setab=\E[%?%p1%{8}%<%t4%p1%d%e48\:2\:\:%p1%{65536}%/\
%d\:%p1%{256}%/%{255}%&%d\:%p1%{255}%&%d%;m,
setaf=\E[%?%p1%{8}%<%t3%p1%d%e38\:2\:\:%p1%{65536}%/\
%d\:%p1%{256}%/%{255}%&%d\:%p1%{255}%&%d%;m,
$ TERM=xterm-direct emacs -nw
If your terminal is incompatible with XTerm, you may have to use
another TERM
definition. Any terminal whose name includes
‘direct’ should be a candidate. The toe
command can be
used to find out which of these are installed on your system:
$ toe | grep '\-direct'
konsole-direct konsole with direct-color indexing
vte-direct vte with direct-color indexing
st-direct st with direct-color indexing
xterm-direct2 xterm with direct-color indexing (old)
xterm-direct xterm with direct-color indexing
If Terminfo database is not available, but 24-bit direct color mode is
supported, it can still be enabled by defining the environment
variable COLORTERM
to ‘truecolor’.
Terminals with ‘RGB’ capability treat pixels #000001 - #000007 as
indexed colors to maintain backward compatibility with applications
that are unaware of direct color mode. Therefore the seven darkest
blue shades may not be available. If this is a problem, you can
always use custom terminal definition with ‘setb24’ and
‘setf24’.
5.4 How do I debug an init file?
Start Emacs with the ‘-debug-init’ command-line option. This
enables the Emacs Lisp debugger before evaluating your init
file, and places you in the debugger if something goes wrong. The top
line in the trace-back buffer will be the error message, and the
second or third line of that buffer will display the Lisp code from your
init file that caused the problem.
You can also evaluate an individual function or argument to a function
in your init file by moving the cursor to the end of the
function or argument and typing C-x C-e (M-x
eval-last-sexp).
Use C-h v (M-x describe-variable) to check the value of
variables which you are trying to set or use.
5.5 How do I make Emacs display the current line (or column) number?
By default, Emacs displays the current line number of the point in the
mode line. You can toggle this feature off or on with the command
M-x line-number-mode, or by setting the variable
line-number-mode
. Note that Emacs will not display the line
number if the buffer’s size in bytes is larger than the value of the
variable line-number-display-limit
.
You can similarly display the current column with
M-x column-number-mode, or by putting the form
(setq column-number-mode t)
in your init file (see How do I set up an init file properly?). This
feature is off by default.
The "%c"
format specifier in the variable mode-line-format
will insert the current column’s value into the mode line. See the
documentation for mode-line-format
(using C-h v
mode-line-format RET) for more information on how to set and use
this variable.
The ‘display-line-numbers’ package (added to Emacs in version
26.1) displays line numbers in the text area, before each line, like
the “set number” capability of ‘vi’. Customize the
buffer-local variable display-line-numbers
to activate this
optional display. Alternatively, you can use the
display-line-numbers-mode
minor mode or the global
global-display-line-numbers-mode
. When using these modes,
customize display-line-numbers-type
with the same value as you
would use with display-line-numbers
.
5.6 How can I modify the titlebar to contain the current file name?
The contents of an Emacs frame’s titlebar is controlled by the variable
frame-title-format
, which has the same structure as the variable
mode-line-format
. (Use C-h v or M-x
describe-variable to get information about one or both of these
variables.)
By default, the titlebar for a frame does contain the name of the buffer
currently being visited, except if there is a single frame. In such a
case, the titlebar contains Emacs invocation name and the name of the
machine at which Emacs was invoked. This is done by setting
frame-title-format
to the default value of
(multiple-frames "%b" ("" "%b - GNU Emacs at " system-name))
To modify the behavior such that frame titlebars contain the buffer’s
name regardless of the number of existing frames, include the following
in your init file (see How do I set up an init file properly?):
(setq frame-title-format "%b")
5.7 How do I turn on abbrevs by default just in mode mymode?
Abbrev mode expands abbreviations as you type them. To turn it on in
a specific buffer, use M-x abbrev-mode. To turn it on in every
buffer by default, put this in your init file (see How do I set up an init file properly?):
(setq-default abbrev-mode t)
To turn it on in a specific mode, use:
(add-hook 'mymode-mode-hook
(lambda ()
(setq abbrev-mode t)))
5.8 How do I make Emacs use a certain major mode for certain files?
If you want to use a certain mode foo for all files whose names end
with the extension .bar, this will do it for you:
(add-to-list 'auto-mode-alist '("\\.bar\\'" . foo-mode))
Alternatively, put this somewhere in the first line of any file you want to
edit in the mode foo (in the second line, if the first line begins
with ‘#!’):
The variable interpreter-mode-alist
specifies which mode to use
when loading an interpreted script (e.g., shell, python, etc.). Emacs
determines which interpreter you’re using by examining the first line of
the script. Use C-h v (or M-x describe-variable) on
interpreter-mode-alist
to learn more.
5.9 How can I replace highlighted text with what I type?
Use delete-selection-mode
, which you can start automatically by
placing the following Lisp form in your init file (see How do I set up an init file properly?):
(delete-selection-mode 1)
According to the documentation string for delete-selection-mode
(which you can read using M-x describe-function RET
delete-selection-mode RET):
When Delete Selection mode is enabled, typed text replaces the selection
if the selection is active. Otherwise, typed text is just inserted at
point regardless of any selection.
This mode also allows you to delete (not kill) the highlighted region by
pressing DEL.
5.10 How do I control Emacs’s case-sensitivity when searching/replacing?
The value of the variable case-fold-search
determines whether
searches are case sensitive:
(setq case-fold-search nil) ; make searches case sensitive
(setq case-fold-search t) ; make searches case insensitive
Similarly, for replacing, the variable case-replace
determines
whether replacements preserve case.
You can also toggle case sensitivity at will in isearch with M-c.
To change the case sensitivity just for one major mode, use the major
mode’s hook. For example:
(add-hook 'foo-mode-hook
(lambda ()
(setq case-fold-search nil)))
5.11 How do I search for, delete, or replace unprintable (eight-bit or control) characters?
To search for a single character that appears in the buffer as, for
example, ‘\237’, you can type C-s C-q 2 3 7.
Searching for all unprintable characters is best done with a
regular expression (regexp) search. The easiest regexp to use for
the unprintable chars is the complement of the regexp for the printable
chars.
- Regexp for the printable chars: ‘[\t\n\r\f -~]’
- Regexp for the unprintable chars: ‘[^\t\n\r\f -~]’
To type these special characters in an interactive argument to
isearch-forward-regexp
or re-search-forward
, you need to
use C-q. (‘\t’, ‘\n’, ‘\r’, and ‘\f’ stand
respectively for TAB, LFD, RET, and C-l.) So,
to search for unprintable characters using re-search-forward
:
M-x re-search-forward RET [^ TAB C-q LFD C-q RET C-q C-l SPC -~] RET
Using isearch-forward-regexp
:
C-M-s [^ TAB LFD C-q RET C-q C-l SPC -~]
To delete all unprintable characters, simply use replace-regexp:
M-x replace-regexp RET [^ TAB C-q LFD C-q RET C-q C-l SPC -~] RET RET
Replacing is similar to the above. To replace all unprintable
characters with a colon, use:
M-x replace-regexp RET [^ TAB C-q LFD C-q RET C-q C-l SPC -~] RET : RET
5.13 How do I copy text from the kill ring into the search string?
Use M-y. See Isearch Yank in The GNU Emacs Manual.
5.14 How do I make Emacs wrap words for me?
Use auto-fill-mode
, activated by typing M-x auto-fill-mode.
The default maximum line width is 70, determined by the variable
fill-column
. To learn how to turn this on automatically, see
How do I turn on auto-fill-mode
by default?.
5.15 How do I turn on auto-fill-mode
by default?
To turn on auto-fill-mode
just once for one buffer, use M-x
auto-fill-mode.
To turn it on for every buffer in a certain mode, you must use the
hook for that mode. For example, to turn on auto-fill
mode for
all text buffers, including the following in your init file
(see How do I set up an init file properly?):
(add-hook 'text-mode-hook 'turn-on-auto-fill)
If you want auto-fill
mode on in all major modes, do this:
(setq-default auto-fill-function 'do-auto-fill)
5.16 How do I change load-path
?
In general, you should only add to the load-path
. You can add
directory /dir/subdir to the load path like this:
(add-to-list 'load-path "/dir/subdir/")
To do this relative to your home directory:
(add-to-list 'load-path "~/mysubdir/")
5.17 How do I use an already running Emacs from another window?
emacsclient
, which comes with Emacs, is for editing a file using
an already running Emacs rather than starting up a new Emacs. It does
this by sending a request to the already running Emacs, which must be
expecting the request.
- Setup:
Emacs must have executed the server-start
function for
‘emacsclient’ to work. This can be done either by a command line
option:
or by invoking server-start
from init file (see How do I set up an init file properly?):
(if (some conditions are met) (server-start))
To get your news reader, mail reader, etc., to invoke
‘emacsclient’, try setting the environment variable EDITOR
(or sometimes VISUAL
) to the value ‘emacsclient’. You may
have to specify the full pathname of the ‘emacsclient’ program
instead. Examples:
# csh commands:
setenv EDITOR emacsclient
# using full pathname
setenv EDITOR /usr/local/emacs/etc/emacsclient
# sh command:
EDITOR=emacsclient ; export EDITOR
- Normal use:
When ‘emacsclient’ is run, it connects to the socket and passes its
command line options to Emacs, which at the next opportunity will visit
the files specified. (Line numbers can be specified just like with
Emacs.) The user will have to switch to the Emacs window by hand. When
the user is done editing a file, the user can type C-x # (or
M-x server-edit) to indicate this. If there is another buffer
requested by emacsclient
, Emacs will switch to it; otherwise
emacsclient
will exit, signaling the calling program to continue.
For more information, See Emacs Server in The GNU Emacs Manual.
5.18 How do I make Emacs recognize my compiler’s funny error messages?
Customize the compilation-error-regexp-alist
variable.
5.19 How do I change the indentation for switch
?
Many people want to indent their switch
statements like this:
f()
{
switch(x) {
case A:
x1;
break;
case B:
x2;
break;
default:
x3;
}
}
To achieve this, add the following line to your init file
(see How do I set up an init file properly?):
(c-set-offset 'case-label '+)
5.20 How to customize indentation in C, C++, and Java buffers?
The Emacs cc-mode
features an interactive procedure for
customizing the indentation style, which is fully explained in the
CC Mode manual that is part of the Emacs distribution, see
Customization Indentation in The CC Mode Manual. Here’s a short summary of the procedure:
- Go to the beginning of the first line where you don’t like the
indentation and type C-c C-o. Emacs will prompt you for the
syntactic symbol; type RET to accept the default it suggests.
- Emacs now prompts for the offset of this syntactic symbol, showing the
default (the current definition) inside parentheses. You can choose
one of these:
0
No extra indentation.
+
Indent one basic offset.
-
Outdent one basic offset.
++
Indent two basic offsets
--
Outdent two basic offsets.
*
Indent half basic offset.
/
Outdent half basic offset.
- After choosing one of these symbols, type C-c C-q to reindent
the line or the block according to what you just specified.
- If you don’t like the result, go back to step 1. Otherwise, add the
following line to your init file (see How do I set up an init file properly?):
(c-set-offset 'syntactic-symbol offset)
where syntactic-symbol is the name Emacs shows in the minibuffer
when you type C-c C-o at the beginning of the line, and
offset is one of the indentation symbols listed above (+
,
/
, 0
, etc.) that you’ve chosen during the interactive
procedure.
- Go to the next line whose indentation is not to your liking and repeat
the process there.
It is recommended to put all the resulting (c-set-offset ...)
customizations inside a C mode hook, like this:
(defun my-c-mode-hook ()
(c-set-offset ...)
(c-set-offset ...))
(add-hook 'c-mode-hook 'my-c-mode-hook)
Using c-mode-hook
avoids the need to put a (require 'cc-mode)
into your init file, because c-set-offset
might be
unavailable when cc-mode
is not loaded.
Note that c-mode-hook
runs for C source files only; use
c++-mode-hook
for C++ sources, java-mode-hook
for
Java sources, etc. If you want the same customizations to be in
effect in all languages supported by cc-mode
, use
c-mode-common-hook
.
5.21 How do I make Emacs “typeover” or “overwrite” instead of inserting?
M-x overwrite-mode (a minor mode). This toggles
overwrite-mode
on and off, so exiting from overwrite-mode
is as easy as another M-x overwrite-mode.
On some systems, Insert toggles overwrite-mode
on and off.
5.22 How do I stop Emacs from beeping on a terminal?
Martin R. Frank writes:
Tell Emacs to use the visible bell instead of the audible bell,
and set the visible bell to nothing.
That is, put the following in your TERMCAP
environment variable
(assuming you have one):
And evaluate the following Lisp form:
5.23 How do I turn down the bell volume in Emacs running under X?
On X Window system, you can adjust the bell volume and duration for all
programs with the shell command xset
.
Invoking xset
without any arguments produces some basic
information, including the following:
usage: xset [-display host:dpy] option ...
To turn bell off:
-b b off b 0
To set bell volume, pitch and duration:
b [vol [pitch [dur]]] b on
5.24 How do I tell Emacs to automatically indent a new line to the indentation of the previous line?
Such behavior is automatic (in Text mode). From the etc/NEWS
file for Emacs 20.2:
** In Text mode, now only blank lines separate paragraphs. This makes
it possible to get the full benefit of Adaptive Fill mode in Text mode,
and other modes derived from it (such as Mail mode). TAB in Text
mode now runs the command indent-relative
; this makes a practical
difference only when you use indented paragraphs.
If you want spaces at the beginning of a line to start a paragraph, use
the new mode, Paragraph Indent Text mode.
If you have auto-fill-mode
turned on (see How do I turn on auto-fill-mode
by default?), you can tell Emacs to prefix every line with a certain
character sequence, the fill prefix. Type the prefix at the
beginning of a line, position point after it, and then type C-x .
(set-fill-prefix
) to set the fill prefix. Thereafter,
auto-filling will automatically put the fill prefix at the beginning of
new lines, and M-q (fill-paragraph
) will maintain any fill
prefix when refilling the paragraph.
If you have paragraphs with different levels of indentation, you will
have to set the fill prefix to the correct value each time you move to a
new paragraph. There are many packages available to deal with this
(see Where can I get Emacs Lisp packages that don’t come with Emacs?). Look for “fill” and
“indent” keywords for guidance.
5.25 How do I show which parenthesis matches the one I’m looking at?
By default, show-paren-mode
is enabled in all editing buffers.
Alternatives to this mode include:
- If you’re looking at a right parenthesis (or brace or bracket) you can
delete it and reinsert it. Emacs will momentarily move the cursor to
the matching parenthesis.
- C-M-f (
forward-sexp
) and C-M-b (backward-sexp
)
will skip over one set of balanced parentheses, so you can see which
parentheses match. (You can train it to skip over balanced brackets
and braces at the same time by modifying the syntax table.)
-
Here is some Emacs Lisp that will make the % key show the matching
parenthesis, like in
vi
. In addition, if the cursor isn’t over a
parenthesis, it simply inserts a % like normal.
;; By an unknown contributor
(global-set-key "%" 'match-paren)
(defun match-paren (arg)
"Go to the matching paren if on a paren; otherwise insert %."
(interactive "p")
(cond ((looking-at "\\s(") (forward-list 1) (backward-char 1))
((looking-at "\\s)") (forward-char 1) (backward-list 1))
(t (self-insert-command (or arg 1)))))
5.26 In C mode, can I show just the lines that will be left after #ifdef
commands are handled by the compiler?
M-x hide-ifdef-mode. (This is a minor mode.) You might also want
to investigate cpp.el, which is distributed with Emacs.
5.27 How do I repeat a command as many times as possible?
Use the repeat
command (C-x z) to repeat the last
command. If you preface it with a prefix argument, the prefix arg is
applied to the command.
You can also type C-x ESC ESC
(repeat-complex-command
) to reinvoke commands that used the
minibuffer to get arguments. In repeat-complex-command
you can
type M-p and M-n (and also up-arrow and down-arrow, if your
keyboard has these keys) to scan through all the different complex
commands you’ve typed.
To repeat a set of commands, use keyboard macros. Use C-x ( and
C-x ) to make a keyboard macro that invokes the command and then
type C-x e. See Keyboard Macros in The GNU Emacs Manual.
If you’re really desperate for the .
command in vi
that
redoes the last insertion/deletion, use VIPER, a vi
emulation
mode which comes with Emacs, and which appears to support it.
5.28 What are the valid X resource settings (i.e., stuff in .Xdefaults)?
See X Resources in The GNU Emacs Manual.
You can also use a resource editor, such as editres (for X11R5 and
onwards), to look at the resource names for the menu bar, assuming Emacs
was compiled with the X toolkit.
5.29 How do I execute (“evaluate”) a piece of Emacs Lisp code?
There are a number of ways to execute (evaluate, in Lisp lingo) an
Emacs Lisp form:
- If you want it evaluated every time you run Emacs, put it in a file
named .emacs.d/init.el in your home directory. This is known
as “your init file,” and contains all of your personal
customizations (see How do I set up an init file properly?).
- You can type the form in the *scratch* buffer, and then type
LFD (or C-j) after it. The result of evaluating the form
will be inserted in the buffer.
- In
emacs-lisp-mode
, typing C-M-x evaluates a top-level form
before or around point.
- Typing C-x C-e in any buffer evaluates the Lisp form immediately
before point and prints its value in the echo area.
- Typing M-: or M-x eval-expression allows you to type a Lisp
form in the minibuffer which will be evaluated once you press RET.
- You can use M-x load-file to have Emacs evaluate all the Lisp
forms in a file. (To do this from Lisp use the function
load
instead.)
The functions load-library
, eval-region
,
eval-buffer
, require
, and autoload
are also
useful; see Where can I get documentation on Emacs Lisp?, if you want to learn more
about them.
5.30 How do I change Emacs’s idea of the TAB character’s length?
Set the default value of the variable tab-width
. For example, to set
TAB stops every 10 characters, insert the following in your
init file (see How do I set up an init file properly?):
(setq-default tab-width 10)
Do not confuse variable tab-width
with variable
tab-stop-list
. The former is used for the display of literal
TAB characters. The latter controls what characters are inserted
when you press the TAB character in certain modes.
5.31 How do I insert <some text> at the beginning of every line?
To do this to an entire buffer, type M-< M-x replace-regexp
RET ^ RET your text RET.
To do this to a region, use string-insert-rectangle
.
Set the mark (C-SPC) at the beginning of the first line you
want to prefix, move the cursor to last line to be prefixed, and type
M-x string-insert-rectangle RET. To do this for the whole
buffer, type C-x h M-x string-insert-rectangle RET.
If you are trying to prefix a yanked mail message with ‘>’, you
might want to set the variable mail-yank-prefix
. In Message
buffers, you can even use M-; to cite yanked messages (M-;
runs the function comment-region
, it is a general-purpose
mechanism to comment regions) (see How do I change the included text prefix in mail/news followups?).
5.32 How do I make Emacs behave like this: when I go up or down, the cursor should stay in the same column even if the line is too short?
Use M-x picture-mode.
See also the variable track-eol
and the command
set-goal-column
bound to C-x C-n
(see Moving Point in The GNU Emacs Manual).
5.33 How do I tell Emacs to iconify itself?
C-z iconifies Emacs when running under X and suspends Emacs
otherwise. See Frame Commands in The GNU Emacs Manual.
5.34 How do I use regexps (regular expressions) in Emacs?
See Regexp Backslash in The GNU Emacs Manual.
The or
operator is ‘\|’, not ‘|’, and the grouping operators
are ‘\(’ and ‘\)’. Also, the string syntax for a backslash is
‘\\’. To specify a regular expression like ‘xxx\(foo\|bar\)’
in a Lisp string, use ‘xxx\\(foo\\|bar\\)’.
Note the doubled backslashes!
- Unlike in Unix grep, sed, etc., a complement character set
(‘[^...]’) can match a newline character (LFD a.k.a.
C-j a.k.a. ‘\n’), unless newline is mentioned as one of the
characters not to match.
- The character syntax regexps (e.g., ‘\sw’) are not
meaningful inside character set regexps (e.g., ‘[aeiou]’). (This
is actually typical for regexp syntax.)
5.35 How do I perform a replace operation across more than one file?
Dired mode (M-x dired RET, or C-x d) supports the
command dired-do-find-regexp-and-replace
(Q), which allows
users to replace regular expressions in multiple files.
You can use this command to perform search/replace operations on
multiple files by following the following steps:
- Assemble a list of files you want to operate on with either
find-dired
, find-name-dired
or find-grep-dired
.
- Mark all files in the resulting Dired buffer using t.
- Use Q to start a
query-replace-regexp
session on the marked
files.
- To accept all replacements in each file, hit !.
Another way to do the same thing is to use the “tags” feature of
Emacs: it includes the command tags-query-replace
which performs
a query-replace across all the files mentioned in the TAGS file.
See Identifier Search in The GNU Emacs Manual.
5.37 How do I disable backup files?
You probably don’t want to do this, since backups are useful, especially
when something goes wrong.
To avoid seeing backup files (and other “uninteresting” files) in
Dired, load dired-x
by adding the following to your init file
(see How do I set up an init file properly?):
(with-eval-after-load 'dired
(require 'dired-x))
With dired-x
loaded, C-x M-o toggles omitting in each dired buffer.
You can make omitting the default for new dired buffers by putting the
following in your init file:
(add-hook 'dired-mode-hook 'dired-omit-mode)
If you’re tired of seeing backup files whenever you do an ‘ls’ at
the Unix shell, try GNU ls
with the ‘-B’ option. GNU
ls
is part of the GNU Fileutils package, available from
https://ftp.gnu.org and its mirrors (see Where can I get other up-to-date GNU stuff?).
To disable or change the way backups are made,
see Backup Names in The GNU Emacs Manual.
You can control where Emacs puts backup files by customizing the
variable backup-directory-alist
. This variable’s value
specifies that files whose names match specific patterns should have
their backups put in certain directories. A typical use is to add the
element ("." . dir)
to force Emacs to put all
backup files in the directory dir.
5.38 How do I disable auto-save-mode
?
You probably don’t want to do this, since auto-saving is useful,
especially when Emacs or your computer crashes while you are editing a
document.
Instead, you might want to change the variable
auto-save-interval
, which specifies how many keystrokes Emacs
waits before auto-saving. Increasing this value forces Emacs to wait
longer between auto-saves, which might annoy you less.
You might also want to look into Sebastian Kremer’s auto-save
package (see Where can I get Emacs Lisp packages that don’t come with Emacs?). This
package also allows you to place all auto-save files in one directory,
such as /tmp.
To disable or change how auto-save-mode
works,
see Auto Save in The GNU Emacs Manual.
5.39 Making Emacs write all auxiliary files somewhere else
By default, Emacs may create many new files in the directory where
you’re editing a file. If you’re editing the file
/home/user/foo.txt, Emacs will create the lock file
/home/user/.#foo.txt, the auto-save file
/home/user/#foo.txt#, and when you save the file, Emacs will
create the backup file /home/user/foo.txt~. (The first two
files are deleted when you save the file.)
This may be inconvenient in some setups, so Emacs has mechanisms for
changing the locations of all these files.
auto-save-file-name-transforms
(see Auto-Saving in GNU Emacs Lisp Reference Manual).
lock-file-name-transforms
(see File Locks in GNU Emacs Lisp Reference Manual).
backup-directory-alist
(see Making Backups in GNU Emacs Lisp Reference Manual).
For instance, to write all these things to
~/.emacs.d/aux/:
(setq lock-file-name-transforms
'(("\\`/.*/\\([^/]+\\)\\'" "~/.emacs.d/aux/\\1" t)))
(setq auto-save-file-name-transforms
'(("\\`/.*/\\([^/]+\\)\\'" "~/.emacs.d/aux/\\1" t)))
(setq backup-directory-alist
'((".*" . "~/.emacs.d/aux/")))
5.40 How can I go to a certain line given its number?
Are you sure you indeed need to go to a line by its number? Perhaps all
you want is to display a line in your source file for which a compiler
printed an error message? If so, compiling from within Emacs using the
M-x compile and M-x recompile commands is a much more
effective way of doing that. Emacs automatically intercepts the compile
error messages, inserts them into a special buffer called
*compilation*, and lets you visit the locus of each message in
the source. Type C-x ` to step through the offending lines one by
one (you can also use M-g M-p and M-g M-n to go to the
previous and next matches directly). Click mouse-2 or press
RET on a message text in the *compilation* buffer to go
to the line whose number is mentioned in that message.
But if you indeed need to go to a certain text line, type M-g M-g
(which is the default binding of the goto-line
function).
Emacs will prompt you for the number of the line and go to that line.
You can do this faster by invoking goto-line
with a numeric
argument that is the line’s number. For example, C-u 286 M-g M-g
will jump to line number 286 in the current buffer.
5.42 How do I delete menus and menu options?
The simplest way to remove a menu is to set its keymap to ‘nil’.
For example, to delete the ‘Words’ menu (see How can I create or modify new pull-down menu options?), use:
(define-key global-map [menu-bar words] nil)
Similarly, removing a menu option requires redefining a keymap entry to
nil
. For example, to delete the ‘Forward word’ menu option
from the ‘Edit’ menu (we added it in How can I create or modify new pull-down menu options?), use:
(define-key global-map [menu-bar edit forward] nil)
5.43 How do I turn on syntax highlighting?
font-lock-mode
is the standard way to have Emacs perform syntax
highlighting in the current buffer. It is enabled by default.
With font-lock-mode
turned on, different types of text will
appear in different colors. For instance, in a programming mode,
variables will appear in one face, keywords in a second, and comments in
a third.
To turn font-lock-mode
off within an existing buffer, use
M-x font-lock-mode RET.
Highlighting a buffer with font-lock-mode
can take quite a while,
and cause an annoying delay in display, so several features exist to
work around this.
Turning on font-lock-mode
automatically activates
Just-In-Time fontification provided by jit-lock-mode
.
jit-lock-mode
defers the fontification of portions of buffer
until you actually need to see them, and can also fontify while Emacs
is idle. This makes display of the visible portion of a buffer almost
instantaneous. For details about customizing jit-lock-mode
,
type C-h f jit-lock-mode RET.
Different levels of decoration are available, from slight to gaudy.
More decoration means you need to wait more time for a buffer to be
fontified (or a faster machine). To control how decorated your
buffers should become, set the value of
font-lock-maximum-decoration
in your init file (see How do I set up an init file properly?), with a nil
value indicating default
(usually minimum) decoration, and a t
value indicating the
maximum decoration. For the gaudiest possible look, then, include the
line
(setq font-lock-maximum-decoration t)
in your init file. You can also set this variable such that
different modes are highlighted in a different ways; for more
information, see the documentation for
font-lock-maximum-decoration
with C-h v (or M-x
describe-variable RET).
Also see the documentation for the function font-lock-mode
,
available by typing C-h f font-lock-mode (M-x
describe-function RET font-lock-mode RET).
To print buffers with the faces (i.e., colors and fonts) intact, use
M-x ps-print-buffer-with-faces or M-x
ps-print-region-with-faces. You will need a way to send text to a
PostScript printer, or a PostScript interpreter such as Ghostscript;
consult the documentation of the variables ps-printer-name
,
ps-lpr-command
, and ps-lpr-switches
for more details.
5.45 How can I edit MS-DOS files using Emacs?
Detection and handling of MS-DOS (and Windows) files is performed
transparently. You can open MS-DOS files on a Unix system, edit it,
and save it without having to worry about the file format.
When editing an MS-DOS style file, the mode line will indicate that it
is a DOS file. On Unix and GNU/Linux systems, and also on a Macintosh,
the string ‘(DOS)’ will appear near the left edge of the mode line;
on DOS and Windows, where the DOS end-of-line (EOL) format is the
default, a backslash (‘\’) will appear in the mode line.
5.46 How can I tell Emacs to fill paragraphs with a single space after each period?
Add the following line to your init file (see How do I set up an init file properly?):
(setq sentence-end-double-space nil)
5.47 Why these strange escape sequences from ls
from the Shell mode?
In many systems, ls
is aliased to ‘ls --color’, which
prints using ANSI color escape sequences. Emacs includes the
ansi-color
package, which lets Shell mode recognize these
escape sequences. It is enabled by default.
5.48 How can I start Emacs in fullscreen mode on MS-Windows?
Beginning with Emacs 24.4 either run Emacs with the ‘--maximized’
command-line option or put the following form in your init file
(see How do I set up an init file properly?):
(add-hook 'emacs-startup-hook 'toggle-frame-maximized)
With older versions use the function w32-send-sys-command
. For
example, you can put the following in your init file:
(add-hook 'emacs-startup-hook
(lambda () (w32-send-sys-command ?\xF030)))
To avoid the slightly distracting visual effect of Emacs starting with
its default frame size and then growing to fullscreen, you can add an
‘Emacs.Geometry’ entry to the Windows Registry settings. See X
Resources in The GNU Emacs Manual. To compute the correct
values for width and height you use in the Registry settings, first
maximize the Emacs frame and then evaluate (frame-height)
and
(frame-width)
with M-:.
Alternatively, you can avoid the visual effect of Emacs changing its
frame size entirely in your init file (i.e., without using the
Registry), like this:
(setq frame-resize-pixelwise t)
(set-frame-position nil 0 0)
(set-frame-size nil (display-pixel-width) (display-pixel-height) t)
5.49 How can I alleviate the limitations of the Linux console?
If possible, we recommend running Emacs inside fbterm
, when
in a Linux console. This brings the Linux console on par with most
terminal emulators under X. To do this, install fbterm
, for
example with the package manager of your GNU/Linux distribution, and
execute the command
This will create a sample configuration file ~/.fbtermrc in
your home directory. Edit that file and change the options
font-names
and font-size
if necessary. For the former,
you can choose one or more of the lines in the output of the following
command, separated by commas:
$ fc-list :spacing=mono family | sed 's/ /\\ /g'
Note that you can fine-tune the appearance of the fonts by adding
attribute-value pairs, separated by colons, after each font name. For
example,
font-names=DejaVu\ Sans\ Mono:style=bold:antialias=false
selects the bold style of the DejaVu Sans Mono font, and disables
anti-aliasing.
You can now start Emacs inside fbterm
with the command
$ fbterm -- env TERM=fbterm emacs
In some versions of fbterm
, setting TERM
to
‘fbterm’ can be omitted. To check whether it is needed, start
Emacs inside fbterm
with the command
and type M-x list-colors-display. If only 8 colors are
displayed, it is necessary; if 256 colors are displayed, it isn’t.
You may want to add an alias for that command in your shell
configuration file. For example, if you use Bash, you can add the
following line to your ~/.bashrc file:
alias emacs="fbterm -- env TERM=fbterm emacs"
or, if you use Emacs both in the Linux console and under X:
[[ "$(tty)" =~ "/dev/tty" ]] && alias emacs="fbterm -- env TERM=fbterm emacs"
The fbterm
terminal emulator may define a number of key
bindings for its own use, some of which conflict with those that Emacs
uses. Execute the following two commands as root to ensure that
fbterm
does not define these key bindings:
# chmod a-s `which fbterm`
# setcap cap_sys_tty_config=-ep `which fbterm`
If you use Emacs as root, the above is not enough however, because the
root user has all privileges. You can use the following command to
start Emacs inside fbterm
as root while ensuring that
fbterm
does not define any key bindings for its own use:
# capsh --drop=cap_sys_tty_config -- -c "fbterm -- env TERM=fbterm emacs"
Again you may want to add a shortcut for that command in the shell
configuration file of the root user. In this case however, it is not
possible to use an alias, because the command line arguments passed to
Emacs need to be inserted in the string at the end of the command. A
wrapper script or a function can be used to do that. For example, if
you use Bash, you can add the following function in the root user
~/.bashrc file:
function emacs ()
{
CMD="fbterm -- env TERM=fbterm emacs "
for ARG in "$@"
do
CMD="$CMD '$ARG' "
done
capsh --drop=cap_sys_tty_config -- -c "$CMD"
}
6 Bugs and problems
The Emacs manual lists some common kinds of trouble users could get
into, see Dealing with Emacs Trouble in The GNU
Emacs Manual, so you might look there if the problem you encounter
isn’t described in this chapter. If you decide you’ve discovered a bug,
see Reporting Bugs in The GNU Emacs Manual, for
instructions how to do that.
The file etc/PROBLEMS in the Emacs distribution lists various
known problems with building and using Emacs on specific platforms;
type C-h C-p to read it.
6.1 Does Emacs have problems with large files?
Emacs has an inherent fixed limitation on the size of buffers. This
limit is stricter than the maximum size of objects supported by other
programs on the same architecture.
The maximum buffer size on 32-bit machines is 512 MBytes. If Emacs
was built using the --with-wide-int
flag, the maximum buffer
size on 32-bit machines is 2 GB.
Emacs compiled on a 64-bit machine can handle much larger buffers; up
to most-positive-fixnum
(2.3 exabytes).
Due to things like decoding of multibyte characters, you can only
visit files with a size that is roughly half the buffer size limit.
When visiting compressed archives, the file size limit will be
smaller than that due to decompression.
6.2 How do I get rid of ‘^M’ or echoed commands in my shell buffer?
Try typing M-x comint-strip-ctrl-m RET while in shell-mode
to
make them go away. If that doesn’t work, you have several options:
For tcsh
, put this in your .cshrc (or .tcshrc)
file:
if ($?INSIDE_EMACS && $?tcsh)
unset edit
stty -icrnl -onlcr -echo susp ^Z
endif
Or put this in your .emacs_tcsh or ~/.emacs.d/init_tcsh.sh file:
unset edit
stty -icrnl -onlcr -echo susp ^Z
Alternatively, use csh
in your shell buffers instead of
tcsh
. One way is:
(setq explicit-shell-file-name "/bin/csh")
and another is to do this in your .cshrc (or .tcshrc)
file:
(You must start Emacs over again with the environment variable properly
set for this to take effect.)
You can also set the ESHELL
environment variable in Emacs Lisp
with the following Lisp form,
(setenv "ESHELL" "/bin/csh")
The above solutions try to prevent the shell from producing the
‘^M’ characters in the first place. If this is not possible
(e.g., if you use a Windows shell), you can get Emacs to remove these
characters from the buffer by adding this to your init file
(see How do I set up an init file properly?):
(add-hook 'comint-output-filter-functions #'comint-strip-ctrl-m)
On a related note: if your shell is echoing your input line in the shell
buffer, you might want to customize the comint-process-echoes
variable in your shell buffers, or try the following command in your
shell start-up file:
stty -icrnl -onlcr -echo susp ^Z
6.3 Why do I get an error message when I try to run M-x shell?
This might happen because Emacs tries to look for the shell in a wrong
place. If you know where your shell executable is, set the variable
explicit-shell-file-name
in your init file (see How do I set up an init file properly?) to point to its full file name.
Some people have trouble with Shell Mode on MS-Windows because of
intrusive antivirus software; disabling the resident antivirus program
solves the problems in those cases.
6.4 Where is the termcap/terminfo entry for terminal type ‘emacs’?
The termcap entry for terminal type ‘emacs’ is ordinarily put in
the ‘TERMCAP’ environment variable of subshells. It may help in
certain situations (e.g., using rlogin from shell buffer) to add an
entry for ‘emacs’ to the system-wide termcap file. Here is a
correct termcap entry for ‘emacs’:
To make a terminfo entry for ‘emacs’, use tic
or
captoinfo
. You need to generate
/usr/lib/terminfo/e/emacs. It may work to simply copy
/usr/lib/terminfo/d/dumb to /usr/lib/terminfo/e/emacs.
Having a termcap/terminfo entry will not enable the use of full screen
programs in shell buffers. Use M-x term for that instead.
A workaround to the problem of missing termcap/terminfo entries is to
change terminal type ‘emacs’ to type ‘dumb’ or ‘unknown’
in your shell start up file. csh
users could put this in their
.cshrc files:
if ("$term" == emacs) set term=dumb
6.6 Why does Emacs ignore my X resources (my .Xdefaults file)?
Emacs searches for X resources in the files specified by the following
environment variables:
-
XFILESEARCHPATH
-
XUSERFILESEARCHPATH
-
XAPPLRESDIR
This emulates the functionality provided by programs written using the
Xt toolkit.
XFILESEARCHPATH
and XUSERFILESEARCHPATH
should be a list
of file names separated by colons. XAPPLRESDIR
should be a list
of directories separated by colons.
Emacs searches for X resources:
- specified on the command line, with the ‘-xrm RESOURCESTRING’ option,
- then in the value of the ‘XENVIRONMENT’ environment variable,
- - or if that is unset, in the file named
~/.Xdefaults-hostname if it exists (where hostname is
the name of the machine Emacs is running on),
- then in the screen-specific and server-wide resource properties provided
by the server,
- - or if those properties are unset, in the file named ~/.Xdefaults
if it exists,
- then in the files listed in ‘XUSERFILESEARCHPATH’,
- - or in files named lang/Emacs in directories listed in
‘XAPPLRESDIR’ (where lang is the value of the
LANG
environment variable), if the ‘LANG’ environment variable is set,
- - or in files named Emacs in the directories listed in ‘XAPPLRESDIR’
- - or in ~/lang/Emacs (if the
LANG
environment variable
is set),
- - or in ~/Emacs,
- then in the files listed in
XFILESEARCHPATH
.
6.7 Why don’t my customizations of the frame parameters work?
This probably happens because you have set the frame parameters in the
variable initial-frame-alist
. That variable holds parameters
used only for the first frame created when Emacs starts. To customize
the parameters of all frames, change the variable
default-frame-alist
instead.
These two variables exist because many users customize the initial frame
in a special way. For example, you could determine the position and
size of the initial frame, but would like to control the geometry of the
other frames by individually positioning each one of them.
6.8 How do I edit a file with a ‘$’ in its name?
When entering a file name in the minibuffer, Emacs will attempt to expand
a ‘$’ followed by a word as an environment variable. To suppress
this behavior, type $$ instead.
6.9 Why does shell mode lose track of the shell’s current directory?
Emacs has no way of knowing when the shell actually changes its
directory. This is an intrinsic limitation of Unix. So it tries to
guess by recognizing ‘cd’ commands. If you type cd followed
by directory with a variable reference (cd $HOME/bin) or
with a shell metacharacter (cd ../lib*), Emacs will fail to
correctly guess the shell’s new current directory. A huge variety of
fixes and enhancements to shell mode for this problem have been written
to handle this problem (see How do I find an Emacs Lisp package that does XXX?).
You can tell Emacs the shell’s current directory with the command
M-x dirs.
6.10 Are there any security risks in Emacs?
- Third party packages.
Any package you install into Emacs can run arbitrary code with the
same privileges as the Emacs process itself. Be aware of this when
you use the package system (e.g. M-x list-packages
) with third
party archives. Use only third parties that you can trust!
- The
file-local-variable
feature. (Yes, a risk, but easy to
change.)
There is an Emacs feature that allows the setting of local values for
variables when editing a file by including specially formatted text near
the end of the file. This feature also includes the ability to have
arbitrary Emacs Lisp code evaluated when the file is visited.
Obviously, there is a potential for Trojan horses to exploit this
feature.
Emacs has a list of local variables that are known to be safe to set.
If a file tries to set any variable outside this list, it asks the
user to confirm whether the variables should be set. You can also tell
Emacs whether to allow the evaluation of Emacs Lisp code found at the
bottom of files by setting the variable enable-local-eval
.
See File Variables in The GNU Emacs Manual.
- Browsing the web.
Emacs relies on C libraries to parse images, and historically, many of
these have had exploitable weaknesses. If you’re browsing the web
with the eww browser, it will usually download and display images
using these libraries. If an image library has a weakness, it may be
used by an attacker to gain access.
6.11 Dired says, ‘no file on this line’ when I try to do something.
Dired uses a regular expression to find the beginning of a file name.
In a long Unix-style directory listing (‘ls -l’), the file name
starts after the date. The regexp has thus been written to look for the
date. By default, it should understand dates and times regardless of
the language, but if your directory listing has an unusual format, Dired
may get confused.
There are two approaches to solving this. The first one involves
setting things up so that ‘ls -l’ outputs a more standard format.
See your OS manual for more information.
The second approach involves changing the regular expression used by
dired, directory-listing-before-filename-regexp
.
9 Key bindings
9.1 How do I bind keys (including function keys) to commands?
Keys can be bound to commands either interactively or in your init
file (see How do I set up an init file properly?). To interactively bind
keys for all modes, type M-x global-set-key RET key
cmd RET.
To bind a key just in the current major mode, type M-x
local-set-key RET key cmd RET.
See Key Bindings in The GNU Emacs Manual.
To make the process of binding keys interactively easier, use the
following “trick”: First bind the key interactively, then immediately
type C-x ESC ESC C-a C-k C-g. Now, the command needed
to bind the key is in the kill ring, and can be yanked into your
init file. If the key binding is global, no changes to the
command are required. For example,
(global-set-key [f1] 'help-for-help)
can be placed directly into your init file. If the key binding is
local, the command is used in conjunction with the ‘add-hook’
function. For example, in TeX mode, a local binding might be
(add-hook 'tex-mode-hook
(lambda ()
(local-set-key [f1] 'help-for-help)))
- Control characters in key sequences, in the form yanked from the kill
ring are given in their graphic form—i.e., CTRL is shown as
‘^’, TAB as a set of spaces (usually 8), etc. You may want
to convert these into their vector or string forms.
- If a prefix key of the character sequence to be bound is already
bound as a complete key, then you must unbind it before the new
binding. For example, if ESC { is previously bound:
(global-unset-key [?\e ?{]) ;; or
(local-unset-key [?\e ?{])
- Aside from commands and “lambda lists,” a vector or string also
can be bound to a key and thus treated as a macro. For example:
(global-set-key [f10] [?\C-x?\e?\e?\C-a?\C-k?\C-g]) ;; or
(global-set-key [f10] "\C-x\e\e\C-a\C-k\C-g")
9.2 Why does Emacs say ‘Key sequence XXX uses invalid prefix characters’?
Usually, one of two things has happened. In one case, the control
character in the key sequence has been misspecified (e.g., ‘C-f’
used instead of ‘\C-f’ within a Lisp expression). In the other
case, a prefix key in the keystroke sequence you were trying to bind
was already bound as a complete key. Historically, the ‘ESC [’
prefix was usually the problem, in which case you should evaluate either
of these forms before attempting to bind the key sequence:
(global-unset-key [?\e ?[]) ;; or
(global-unset-key "\e[")
9.3 Why doesn’t this [terminal or window-system setup] code work in my init file, but it works just fine after Emacs starts up?
During startup, Emacs initializes itself according to a given
code/file order. If some of the code executed in your init file
(see How do I set up an init file properly?) needs to be postponed until
the initial terminal or window-system setup code has been executed but
is not, then you will experience this problem (this code/file
execution order is not enforced after startup).
To postpone the execution of Emacs Lisp code until after terminal or
window-system setup, treat the code as a lambda list and add it to
emacs-startup-hook
(or tty-setup-hook
in Emacs 24.4 and
newer). For example,
(add-hook 'emacs-startup-hook
(lambda ()
(when (string-match "\\`vt220" (or (getenv "TERM") ""))
;; Make vt220's "Do" key behave like M-x:
(global-set-key [do] 'execute-extended-command))))
For information on what Emacs does every time it is started, see the
lisp/startup.el file.
9.4 How do I tell what characters or symbols my function or arrow keys emit?
Type C-h c then the function or arrow keys. The command will
return either a function key symbol or character sequence (see the
Emacs documentation for an explanation). This works for other
keys as well.
9.5 How do I set the X key “translations” for Emacs?
Emacs is not written using the Xt library by default, so there are no
“translations” to be set. (We aren’t sure how to set such translations
if you do build Emacs with Xt; please let us know if you’ve done this!)
The only way to affect the behavior of keys within Emacs is through
xmodmap
(outside Emacs) or define-key
(inside Emacs). The
define-key
command should be used in conjunction with the
local-function-key-map
map. For instance,
(define-key function-key-map [M-TAB] [?\M-\t])
defines the M-TAB key sequence.
9.6 Why does the Backspace key invoke help?
The Backspace key (on most keyboards) generates ASCII code 8.
C-h sends the same code. In Emacs by default C-h invokes
help-command. This is intended to be easy to remember since the first
letter of ‘help’ is ‘h’. The easiest solution to this problem
is to use C-h (and Backspace) for help and DEL (the
Delete key) for deleting the previous character.
For many people this solution may be problematic:
When Emacs runs on a windowed display, it binds the Delete key
to a command which deletes the character at point, to make Emacs more
consistent with keyboard operation on these systems.
For more information about troubleshooting this problem, see If DEL Fails to Delete in The GNU Emacs
Manual.
9.7 How do I swap two keys?
You can swap two keys (or key sequences) by using the
keyboard-translate
function. For example, to turn C-h
into DEL and DEL to C-h, use
(keyboard-translate ?\C-h ?\C-?) ; translate 'C-h' to DEL
(keyboard-translate ?\C-? ?\C-h) ; translate DEL to 'C-h'.
The first key sequence of the pair after the function identifies what is
produced by the keyboard; the second, what is matched for in the
keymaps.
However, in the specific case of C-h and DEL, you should
toggle normal-erase-is-backspace-mode
instead of calling
keyboard-translate
.
See DEL Does Not Delete in The GNU Emacs Manual.
Keyboard translations are not the same as key bindings in keymaps.
Emacs contains numerous keymaps that apply in different situations, but
there is only one set of keyboard translations, and it applies to every
character that Emacs reads from the terminal. Keyboard translations
take place at the lowest level of input processing; the keys that are
looked up in keymaps contain the characters that result from keyboard
translation.
9.8 How do I produce C-XXX with my keyboard?
On terminals (but not under X), some common “aliases” are:
- C-2 or C-SPC
C-@
- C-6
C-^
- C-7 or C-S--
C-_
- C-4
C-\
- C-5
C-]
- C-/
C-?
Often other aliases exist; use the C-h c command and try
CTRL with all of the digits on your keyboard to see what gets
generated. You can also try the C-h w command if you know the
name of the command.
9.10 What if I don’t have an Escape key?
Type C-[ instead. This should send ASCII code 27 just like an
Escape key would. C-3 may also work on some terminal (but not
under X). For many terminals (notably DEC terminals) F11
generates ESC. If not, the following form can be used to bind it:
;; F11 is the documented ESC replacement on DEC terminals.
(define-key function-key-map [f11] [?\e])
9.11 Can I make my Compose Character key behave like a Meta key?
On a dumb terminal such as a VT220, no. It is rumored that certain
VT220 clones could have their Compose key configured this way. If
you’re using X, you might be able to do this with the xmodmap
command.
9.12 How do I bind a combination of modifier key and function key?
You can represent modified function keys in vector format by adding
prefixes to the function key symbol. For example (from the Emacs
documentation):
(global-set-key [?\C-x right] 'forward-page)
where ‘?\C-x’ is the Lisp character constant for the character C-x.
You can use the modifier keys Control, Meta, Hyper,
Super, Alt, and Shift with function keys. To
represent these modifiers, prepend the strings ‘C-’, ‘M-’,
‘H-’, ‘s-’, ‘A-’, and ‘S-’ to the symbol name. Here
is how to make H-M-RIGHT move forward a word:
(global-set-key [H-M-right] 'forward-word)
- Not all modifiers are permitted in all situations. Hyper,
Super, and Alt are not available on Unix character
terminals. Non-ASCII keys and mouse events (e.g., C-= and
mouse-1) also fall under this category.
See How do I bind keys (including function keys) to commands?, for general key binding instructions.