Since only part of a large buffer fits in the window, Emacs has to show only a part of it. This chapter describes commands and variables that let you specify which part of the text you want to see, and how the text is displayed.
If a window is too small to display all the text in its buffer, it displays only a portion of it. Scrolling commands change which portion of the buffer is displayed.
Scrolling forward or up advances the portion of the buffer displayed in the window; equivalently, it moves the buffer text upwards relative to the window. Scrolling backward or down displays an earlier portion of the buffer, and moves the text downwards relative to the window.
In Emacs, scrolling up or down refers to the direction that the text moves in the window, not the direction that the window moves relative to the text. This terminology was adopted by Emacs before the modern meaning of “scrolling up” and “scrolling down” became widespread. Hence, the strange result that PageDown scrolls up in the Emacs sense.
The portion of a buffer displayed in a window always contains point. If you move point past the bottom or top of the window, scrolling occurs automatically to bring it back onscreen (see Automatic Scrolling). You can also scroll explicitly with these commands:
Scroll forward by nearly a full window (scroll-up-command).
Scroll backward (scroll-down-command).
C-v (scroll-up-command) scrolls forward by nearly the
whole window height. The effect is to take the two lines at the
bottom of the window and put them at the top, followed by lines that
were not previously visible. If point was in the text that scrolled
off the top, it ends up on the window’s new topmost line. The
PageDown (or next) key is equivalent to C-v.
M-v (scroll-down-command) scrolls backward in a similar
way. The PageUp (or prior) key is equivalent to
M-v.
The number of lines of overlap left by these scroll commands is
controlled by the variable next-screen-context-lines, whose
default value is 2. You can supply the commands with a numeric prefix
argument, n, to scroll by n lines; Emacs attempts to leave
point unchanged, so that the text and point move up or down together.
C-v with a negative argument is like M-v and vice versa.
By default, these commands signal an error (by beeping or flashing
the screen) if no more scrolling is possible, because the window has
reached the beginning or end of the buffer. If you change the
variable scroll-error-top-bottom to t, these commands
move point to the farthest possible position. If point is already
there, the commands signal an error.
Some users like scroll commands to keep point at the same screen
position, so that scrolling back to the same screen conveniently
returns point to its original position. You can enable this behavior
via the variable scroll-preserve-screen-position. If the value
is t, Emacs adjusts point to keep the cursor at the same screen
position whenever a scroll command moves it off-window, rather than
moving it to the topmost or bottommost line. With any other
non-nil value, Emacs adjusts point this way even if the scroll
command leaves point in the window. This variable affects all the
scroll commands documented in this section, as well as scrolling with
the mouse wheel (see Mouse Commands for Editing); in general, it affects any
command that has a non-nil scroll-command property.
See Property Lists in The Emacs Lisp Reference Manual. The
same property also causes Emacs not to exit incremental search when
one of these commands is invoked and isearch-allow-scroll is
non-nil (see Not Exiting Incremental Search).
Sometimes, particularly when you hold down keys such as C-v
and M-v, activating keyboard auto-repeat, Emacs fails to keep up
with the rapid rate of scrolling requested; the display doesn’t update
and Emacs can become unresponsive to input for quite a long time. You
can counter this sluggishness by setting the variable
fast-but-imprecise-scrolling to a non-nil value. This
instructs the scrolling commands not to fontify (see Font Lock mode)
any unfontified text they scroll over, instead to assume it has the
default face. This can cause Emacs to scroll to somewhat wrong buffer
positions when the faces in use are not all the same size, even with
single (i.e., without auto-repeat) scrolling operations.
As an alternative to setting fast-but-imprecise-scrolling you
might prefer to enable jit-lock deferred fontification (see Font Lock mode). To do this, customize jit-lock-defer-time to a small
positive number such as 0.25, or even 0.1 if you type quickly. This
gives you less jerky scrolling when you hold down C-v, but the
window contents after any action which scrolls into a fresh portion of
the buffer will be momentarily unfontified.
Finally, a third alternative to these variables is
redisplay-skip-fontification-on-input. If this variable is
non-nil, skip some fontifications if there’s input pending.
This usually does not affect the display because redisplay is
completely skipped anyway if input was pending, but it can make
scrolling smoother by avoiding unnecessary fontification.
The commands M-x scroll-up and M-x scroll-down behave
similarly to scroll-up-command and scroll-down-command,
except they do not obey scroll-error-top-bottom. Prior to
Emacs 24, these were the default commands for scrolling up and down.
The commands M-x scroll-up-line and M-x scroll-down-line
scroll the current window by one line at a time. If you intend to use
any of these commands, you might want to give them key bindings
(see Rebinding Keys in Your Init File).
On graphical displays, you can also scroll a window using the scroll bar; see Scroll Bars.
Scroll the selected window so the current line is the center-most text
line; on subsequent consecutive invocations, make the current line the
top line, the bottom line, and so on in cyclic order. Possibly
redisplay the screen too (recenter-top-bottom).
Scroll the other window; this is equivalent to C-l acting on the other window.
Scroll the selected window so the current line is the center-most text line. Possibly redisplay the screen too.
Scroll heuristically to bring useful information onto the screen
(reposition-window).
The C-l (recenter-top-bottom) command recenters
the selected window, scrolling it so that the current screen line is
exactly in the center of the window, or as close to the center as
possible.
Typing C-l twice in a row (C-l C-l) scrolls the window so that point is on the topmost screen line. Typing a third C-l scrolls the window so that point is on the bottom-most screen line. Each successive C-l cycles through these three positions.
You can change the cycling order by customizing the list variable
recenter-positions. Each list element should be the symbol
top, middle, or bottom, or a number; an integer
means to move the line to the specified screen line, while a
floating-point number between 0.0 and 1.0 specifies a percentage of
the screen space from the top of the window. The default,
(middle top bottom), is the cycling order described above.
Furthermore, if you change the variable scroll-margin to a
non-zero value n, C-l always leaves at least n
screen lines between point and the top or bottom of the window
(see Automatic Scrolling).
You can also give C-l a prefix argument. A plain prefix argument, C-u C-l, simply recenters the line showing point. A positive argument n moves line showing point n lines down from the top of the window. An argument of zero moves point’s line to the top of the window. A negative argument −n moves point’s line n lines from the bottom of the window. When given an argument, C-l does not clear the screen or cycle through different screen positions.
If the variable recenter-redisplay has a non-nil
value, each invocation of C-l also clears and redisplays the
screen; the special value tty (the default) says to do this on
text-terminal frames only. Redisplaying is useful in case the screen
becomes garbled for any reason (see Garbage on the Screen).
The more primitive command M-x recenter behaves like
recenter-top-bottom, but does not cycle among screen positions.
C-M-l (reposition-window) scrolls the current window
heuristically in a way designed to get useful information onto the
screen. For example, in a Lisp file, this command tries to get the
entire current defun onto the screen if possible.
Emacs performs automatic scrolling when point moves out of the visible portion of the text. Normally, automatic scrolling centers point vertically in the window, but there are several ways to alter this behavior.
If you set scroll-conservatively to a small number n,
then moving point just a little off the screen (no more than n
lines) causes Emacs to scroll just enough to bring point back on
screen; if doing so fails to make point visible, Emacs scrolls just
far enough to center point in the window. If you set
scroll-conservatively to a large number (larger than 100),
automatic scrolling never centers point, no matter how far point
moves; Emacs always scrolls text just enough to bring point into view,
either at the top or bottom of the window depending on the scroll
direction. By default, scroll-conservatively is 0, which
means to always center point in the window.
This said, in minibuffer windows, scrolling is always conservative by
default because scroll-minibuffer-conservatively is non-nil,
which takes precedence over scroll-conservatively.
Another way to control automatic scrolling is to customize the
variable scroll-step. Its value determines the number of lines
by which to automatically scroll, when point moves off the screen. If
scrolling by that number of lines fails to bring point back into view,
point is centered instead. The default value is zero, which (by
default) causes point to always be centered after scrolling.
A third way to control automatic scrolling is to customize the
variables scroll-up-aggressively and
scroll-down-aggressively, which directly specify the vertical
position of point after scrolling. The value of
scroll-up-aggressively should be either nil (the
default), or a floating point number f between 0 and 1. The
latter means that when point goes below the bottom window edge (i.e.,
scrolling forward), Emacs scrolls the window so that point is f
parts of the window height from the bottom window edge. Thus, larger
f means more aggressive scrolling: more new text is brought into
view. The default value, nil, is equivalent to 0.5.
Likewise, scroll-down-aggressively is used when point goes
above the top window edge (i.e., scrolling backward). The value
specifies how far point should be from the top margin of the window
after scrolling. Thus, as with scroll-up-aggressively, a
larger value is more aggressive.
Note that the variables scroll-conservatively,
scroll-step, and scroll-up-aggressively /
scroll-down-aggressively control automatic scrolling in
contradictory ways. Therefore, you should pick no more than one of
these methods to customize automatic scrolling. In case you customize
multiple variables, the order of priority is:
scroll-conservatively, then scroll-step, and finally
scroll-up-aggressively / scroll-down-aggressively.
The variable scroll-margin restricts how close point can come
to the top or bottom of a window (even if aggressive scrolling
specifies a fraction f that is larger than the window portion
between the top and the bottom margins). Its value is a number of
screen lines; if point comes within that many lines of the top or
bottom of the window, Emacs performs automatic scrolling. By default,
scroll-margin is 0. The effective margin size is limited to a
quarter of the window height by default, but this limit can be
increased up to half (or decreased down to zero) by customizing
maximum-scroll-margin.
Horizontal scrolling means shifting all the lines sideways
within a window, so that some of the text near the left margin is not
displayed. When the text in a window is scrolled horizontally, text
lines are truncated rather than continued (see Line Truncation).
If a window shows truncated lines, Emacs performs automatic horizontal
scrolling whenever point moves off the left or right edge of the
screen. By default, all the lines in the window are scrolled
horizontally together, but if you set the variable
auto-hscroll-mode to the special value of current-line,
only the line showing the cursor will be scrolled. To disable
automatic horizontal scrolling entirely, set the variable
auto-hscroll-mode to nil. Note that when the automatic
horizontal scrolling is turned off, if point moves off the edge of the
screen, the cursor disappears to indicate that. (On text terminals,
the cursor is left at the edge instead.)
The variable hscroll-margin controls how close point can get
to the window’s left and right edges before automatic scrolling
occurs. It is measured in columns. For example, if the value is 5,
then moving point within 5 columns of an edge causes horizontal
scrolling away from that edge.
The variable hscroll-step determines how many columns to
scroll the window when point gets too close to the edge. Zero, the
default value, means to center point horizontally within the window.
A positive integer value specifies the number of columns to scroll by.
A floating-point number (whose value should be between 0 and 1)
specifies the fraction of the window’s width to scroll by.
You can also perform explicit horizontal scrolling with the following commands:
Scroll text in current window to the left (scroll-left).
Scroll to the right (scroll-right).
C-x < (scroll-left) scrolls text in the selected window
to the left by the full width of the window, less two columns. (In
other words, the text in the window moves left relative to the
window.) With a numeric argument n, it scrolls by n
columns.
If the text is scrolled to the left, and point moves off the left
edge of the window, the cursor will freeze at the left edge of the
window, until point moves back to the displayed portion of the text.
This is independent of the current setting of
auto-hscroll-mode, which, for text scrolled to the left, only
affects the behavior at the right edge of the window.
C-x > (scroll-right) scrolls similarly to the right.
The window cannot be scrolled any farther to the right once it is
displayed normally, with each line starting at the window’s left
margin; attempting to do so has no effect. This means that you don’t
have to calculate the argument precisely for C-x >; any
sufficiently large argument will restore the normal display.
If you use those commands to scroll a window horizontally, that sets
a lower bound for automatic horizontal scrolling. Automatic scrolling
will continue to scroll the window, but never farther to the right
than the amount you previously set by scroll-left. When
auto-hscroll-mode is set to current-line, all the lines
other than the one showing the cursor will be scrolled by that minimal
amount.
On graphical displays, you can scroll a window horizontally using
the horizontal scroll bar, if you turn on the optional
horizontal-scroll-bar-mode; see Scroll Bars.
Narrowing means focusing in on some portion of the buffer, making the rest temporarily inaccessible. The portion which you can still get to is called the accessible portion. Canceling the narrowing, which makes the entire buffer once again accessible, is called widening. The bounds of narrowing in effect in a buffer are called the buffer’s restriction.
Narrowing can make it easier to concentrate on a single subroutine or paragraph by eliminating clutter. It can also be used to limit the range of operation of a replace command or repeating keyboard macro.
Narrow down to between point and mark (narrow-to-region).
Widen to make the entire buffer accessible again (widen).
Narrow down to the current page (narrow-to-page).
Narrow down to the current defun (narrow-to-defun).
When you have narrowed down to a part of the buffer, that part appears to be all there is. You can’t see the rest, you can’t move into it (motion commands won’t go outside the accessible part), you can’t change it in any way. However, it is not gone, and if you save the file all the inaccessible text will be saved. The word ‘Narrow’ appears in the mode line whenever narrowing is in effect.
The primary narrowing command is C-x n n (narrow-to-region).
It sets the current buffer’s restrictions so that the text in the current
region remains accessible, but all text before the region or after the
region is inaccessible. Point and mark do not change.
Alternatively, use C-x n p (narrow-to-page) to narrow
down to the current page. See Pages, for the definition of a page.
C-x n d (narrow-to-defun) narrows down to the defun
containing point (see Top-Level Definitions, or Defuns).
The way to cancel narrowing is to widen with C-x n w
(widen). This makes all text in the buffer accessible again.
You can get information on what part of the buffer you are narrowed down to using the C-x = command. See Cursor Position Information.
Because narrowing can easily confuse users who do not understand it,
narrow-to-region is normally a disabled command. Attempting to use
this command asks for confirmation and gives you the option of enabling it;
if you enable the command, confirmation will no longer be required for
it. See Disabling Commands.
View mode is a minor mode that lets you scan a buffer by sequential screenfuls. It provides commands for scrolling through the buffer conveniently but not for changing it. Apart from the usual Emacs cursor motion commands, you can type SPC to scroll forward one windowful, S-SPC or DEL to scroll backward, and s to start an incremental search.
Typing q (View-quit) disables View mode, and switches
back to the buffer and position before View mode was enabled. Typing
e (View-exit) disables View mode, keeping the current
buffer and position.
M-x view-buffer prompts for an existing Emacs buffer, switches to it, and enables View mode. M-x view-file prompts for a file and visits it with View mode enabled.
Follow mode is a minor mode that makes two windows, both showing the same buffer, scroll as a single tall virtual window. To use Follow mode, go to a frame with just one window, split it into two side-by-side windows using C-x 3, and then type M-x follow-mode. From then on, you can edit the buffer in either of the two windows, or scroll either one; the other window follows it.
In Follow mode, if you move point outside the portion visible in one window and into the portion visible in the other window, that selects the other window—again, treating the two as if they were parts of one large window.
To turn off Follow mode, type M-x follow-mode a second time.
Emacs can display text in several different styles, called faces. Each face can specify various face attributes, such as the font, height, weight, slant, foreground and background color, and underlining or overlining. Most major modes assign faces to the text automatically, via Font Lock mode. See Font Lock mode, for more information about how these faces are assigned.
To see what faces are currently defined, and what they look like, type M-x list-faces-display. With a prefix argument, this prompts for a regular expression, and displays only faces with names matching that regular expression (see Syntax of Regular Expressions).
It’s possible for a given face to look different in different
frames. For instance, some text terminals do not support all face
attributes, particularly font, height, and width, and some support a
limited range of colors. In addition, most Emacs faces are defined so
that their attributes are different on light and dark frame
backgrounds, for reasons of legibility. By default, Emacs
automatically chooses which set of face attributes to display on each
frame, based on the frame’s current background color. However, you
can override this by giving the variable frame-background-mode
a non-nil value. A value of dark makes Emacs treat all
frames as if they have a dark background, whereas a value of
light makes it treat all frames as if they have a light
background.
You can customize a face to alter its attributes, and save those customizations for future Emacs sessions. See Customizing Faces, for details.
The default face is the default for displaying text, and all
of its attributes are specified. Its background color is also used as
the frame’s background color. See Colors for Faces.
Another special face is the cursor face. On graphical
displays, the background color of this face is used to draw the text
cursor. None of the other attributes of this face have any effect;
the foreground color for text under the cursor is taken from the
background color of the underlying text. On text terminals, the
appearance of the text cursor is determined by the terminal, not by
the cursor face.
You can also use X resources to specify attributes of any particular face. See X Resources.
Emacs can display variable-width fonts, but some Emacs commands, particularly indentation commands, do not account for variable character display widths. Therefore, we recommend not using variable-width fonts for most faces, particularly those assigned by Font Lock mode.
Faces can have various foreground and background colors. When you specify a color for a face—for instance, when customizing the face (see Customizing Faces)—you can use either a color name or an RGB triplet.
A color name is a pre-defined name, such as ‘dark orange’ or
‘medium sea green’. To view a list of color names, type M-x
list-colors-display. To control the order in which colors are shown,
customize list-colors-sort. If you run this command on a
graphical display, it shows the full range of color names known to
Emacs (these are the standard X11 color names, defined in X’s
rgb.txt file). If you run the command on a text terminal, it
shows only a small subset of colors that can be safely displayed on
such terminals. However, Emacs understands X11 color names even on
text terminals; if a face is given a color specified by an X11 color
name, it is displayed using the closest-matching terminal color.
An RGB triplet is a string of the form ‘#RRGGBB’. Each of the primary color components is represented by a hexadecimal number between ‘00’ (intensity 0) and ‘FF’ (the maximum intensity). It is also possible to use one, three, or four hex digits for each component, so ‘red’ can be represented as ‘#F00’, ‘#fff000000’, or ‘#ffff00000000’. The components must have the same number of digits. For hexadecimal values A to F, either upper or lower case are acceptable.
The M-x list-colors-display command also shows the equivalent RGB triplet for each named color. For instance, ‘medium sea green’ is equivalent to ‘#3CB371’.
You can change the foreground and background colors of a face with M-x set-face-foreground and M-x set-face-background. These commands prompt in the minibuffer for a face name and a color, with completion, and then set that face to use the specified color. They affect the face colors on all frames, but their effects do not persist for future Emacs sessions, unlike using the customization buffer or X resources. You can also use frame parameters to set foreground and background colors for a specific frame; See Frame Parameters.
Here are the standard faces for specifying text appearance. You can apply them to specific text when you want the effects they produce.
defaultThis face is used for ordinary text that doesn’t specify any face. Its background color is used as the frame’s background color.
boldThis face uses a bold variant of the default font.
italicThis face uses an italic variant of the default font.
bold-italicThis face uses a bold italic variant of the default font.
underlineThis face underlines text.
fixed-pitchThis face forces use of a fixed-width font. It’s reasonable to customize this face to use a different fixed-width font, if you like, but you should not make it a variable-width font.
fixed-pitch-serifThis face is like fixed-pitch, except the font has serifs and
looks more like traditional typewriting.
variable-pitch ¶This face forces use of a variable-width (i.e., proportional) font. The font size picked for this face matches the font picked for the default (usually fixed-width) font.
variable-pitch-textThis is like the variable-pitch face (from which it inherits),
but is slightly larger. A proportional font of the same height as a
monospace font usually appears visually smaller, and can therefore be
harder to read. When displaying longer texts, this face can be a good
choice over the (slightly smaller) variable-pitch face.
shadow ¶This face is used for making the text less noticeable than the surrounding ordinary text. Usually this can be achieved by using shades of gray in contrast with either black or white default foreground color.
Here’s an incomplete list of faces used to highlight parts of the text temporarily for specific purposes. (Many other modes define their own faces for this purpose.)
highlightThis face is used for text highlighting in various contexts, such as when the mouse cursor is moved over a hyperlink.
isearchThis face is used to highlight the current Isearch match (see Incremental Search).
query-replaceThis face is used to highlight the current Query Replace match (see Replacement Commands).
lazy-highlightThis face is used to highlight lazy matches for Isearch and Query Replace (matches other than the current one).
regionThis face is used for displaying an active region (see The Mark and the Region). When Emacs is built with GTK+ support, its colors are taken from the current GTK+ theme.
secondary-selectionThis face is used for displaying a secondary X selection (see Secondary Selection).
trailing-whitespaceThe face for highlighting excess spaces and tabs at the end of a line
when show-trailing-whitespace is non-nil (see Useless Whitespace).
escape-glyphThe face for displaying control characters and escape sequences (see How Text Is Displayed).
homoglyphThe face for displaying lookalike characters, i.e., characters that look like but are not the characters being represented (see How Text Is Displayed).
nobreak-spaceThe face for displaying no-break space characters (see How Text Is Displayed).
nobreak-hyphenThe face for displaying no-break hyphen characters (see How Text Is Displayed).
The following faces control the appearance of parts of the Emacs frame:
mode-line ¶This is the base face used for the mode lines, as well as header lines and for menu bars when toolkit menus are not used. By default, it’s drawn with shadows for a raised effect on graphical displays, and drawn as the inverse of the default face on text terminals.
The mode-line-active and mode-line-inactive faces (which
are the ones used on the mode lines) inherit from this face.
mode-line-active ¶Like mode-line, but used for the mode line of the currently
selected window. This face inherits from mode-line, so changes
in that face affect mode lines in all windows.
mode-line-inactive ¶Like mode-line, but used for mode lines of the windows other
than the selected one (if mode-line-in-non-selected-windows is
non-nil). This face inherits from mode-line, so changes
in that face affect mode lines in all windows.
mode-line-highlight ¶Like highlight, but used for mouse-sensitive portions of text
on mode lines. Such portions of text typically pop up tooltips
(see Tooltips) when the mouse pointer hovers above them.
mode-line-buffer-id ¶This face is used for buffer identification parts in the mode line.
header-line ¶Similar to mode-line for a window’s header line, which appears
at the top of a window just as the mode line appears at the bottom.
Most windows do not have a header line—only some special modes, such
Info mode, create one.
The header-line-active and header-line-inactive faces (which
are the ones actually used on the header lines) inherit from this face.
header-line-active ¶Like header-line, but used for the header line of the currently
selected window. This face inherits from header-line, so changes
in that face affect header lines in all windows.
header-line-inactive ¶Like header-line, but used for header lines of the windows other
than the selected one (if those windows have a header line). This face
inherits from header-line, so changes in that face affect header
lines in all windows.
header-line-highlight ¶Similar to highlight and mode-line-highlight, but used
for mouse-sensitive portions of text on header lines. This is a
separate face because the header-line face might be customized
in a way that does not interact well with highlight.
tab-line ¶Similar to mode-line for a window’s tab line, which appears
at the top of a window with tabs representing window buffers.
See Window Tab Line.
The tab-line-active and tab-line-inactive faces (which
are the ones actually used on the tab lines) inherit from this face.
tab-line-active ¶Like tab-line, but used for the tab line of the currently
selected window. This face inherits from tab-line, so changes
in that face affect tab lines in all windows.
tab-line-inactive ¶Like tab-line, but used for tab lines of the windows other
than the selected one (if those windows have a tab line). This face
inherits from tab-line, so changes in that face affect tab
lines in all windows.
vertical-border ¶This face is used for the vertical divider between windows on text terminals.
minibuffer-prompt ¶This face is used for the prompt strings displayed in the minibuffer.
By default, Emacs automatically adds this face to the value of
minibuffer-prompt-properties, which is a list of text
properties (see Text Properties in the Emacs Lisp Reference
Manual) used to display the prompt text. (This variable takes effect
when you enter the minibuffer.)
fringe ¶The face for the fringes to the left and right of windows on graphic displays. (The fringes are the narrow portions of the Emacs frame between the text area and the window’s right and left borders.) See Window Fringes.
cursorThe :background attribute of this face specifies the color of
the text cursor. See Displaying the Cursor.
tooltipThis face is used for tooltip text. By default, if Emacs is built with GTK+ support, tooltips are drawn via GTK+ and this face has no effect. See Tooltips.
mouseThis face determines the color of the mouse pointer.
The following faces likewise control the appearance of parts of the Emacs frame, but only on text terminals, or when Emacs is built on X with no toolkit support. (For all other cases, the appearance of the respective frame elements is determined by system-wide settings.)
scroll-barThis face determines the visual appearance of the scroll bar. See Scroll Bars.
tool-barThis face determines the color of tool bar icons. See Tool Bars.
tab-barThis face determines the color of tab bar icons. See Tab Bars.
menuThis face determines the colors and font of Emacs’s menus. See Menu Bars.
tty-menu-enabled-faceThis face is used to display enabled menu items on text-mode terminals.
tty-menu-disabled-faceThis face is used to display disabled menu items on text-mode terminals.
tty-menu-selected-faceThis face is used to display on text-mode terminals the menu item that would be selected if you click a mouse or press RET.
Emacs sometimes displays clickable buttons (or other informative icons), and you can customize how these look on display.
The main customization point here is the icon-preference user
option. By using this, you can tell Emacs your overall preferences
for icons. This is a list of icon types, and the first icon type
that’s supported will be used. The supported types are:
imageUse an image for the icon.
emojiUse a colorful emoji for the icon.
symbolUse a monochrome symbol for the icon.
textUse a simple text for the icon.
In addition, each individual icon can be customized with M-x customize-icon, and themes can further alter the looks of the icons.
To get a quick description of an icon, use the M-x describe-icon command.
To increase the font size of the default face in the current
buffer, type C-x C-+ or C-x C-=. To decrease it, type
C-x C--. To restore the default (global) font size, type
C-x C-0. These keys are all bound to the same command,
text-scale-adjust, which looks at the last key typed to
determine which action to take and adjusts the font size accordingly
by changing the height of the default face.
Most faces don’t have an explicit setting of the :height
attribute, and thus inherit the height from the default face.
Those faces are also scaled by the above commands.
Faces other than default that have an explicit setting of the
:height attribute are not affected by these font size changes.
The header-line face is an exception: it will be scaled even if
it has an explicit setting of the :height attribute.
Similarly, scrolling the mouse wheel with the Ctrl modifier pressed, when the mouse pointer is above buffer text, will increase or decrease the font size of the affected faces, depending on the direction of the scrolling.
The final key of these commands may be repeated without the leading
C-x and without the modifiers. For instance, C-x C-= C-= C-=
and C-x C-= = = increase the face height by three steps. Each
step scales the text height by a factor of 1.2; to change this factor,
customize the variable text-scale-mode-step. A numeric
argument of 0 to the text-scale-adjust command restores the
default height, the same as typing C-x C-0.
Similarly, to change the sizes of the fonts globally, type C-x
C-M-+, C-x C-M-=, C-x C-M-- or C-x C-M-0, or scroll
the mouse wheel with both the Ctrl and Meta modifiers
pressed. To enable frame resizing when the font size is changed
globally, customize the variable
global-text-scale-adjust-resizes-frames (see Easy Customization Interface).
The commands text-scale-increase and
text-scale-decrease increase or decrease the size of the font
in the current buffer, just like C-x C-+ and C-x C--
respectively. You may find it convenient to bind to these commands,
rather than text-scale-adjust.
The command text-scale-set scales the size of the font in the
current buffer to an absolute level specified by its prefix argument.
The above commands automatically enable the minor mode
text-scale-mode if the current font scaling is other than 1,
and disable it otherwise.
The command text-scale-pinch increases or decreases the text
scale based on the distance between fingers on a touchpad when a pinch
gesture is performed by placing two fingers on a touchpad and moving
them towards or apart from each other. This is only available on some
systems with supported hardware.
The command mouse-wheel-text-scale also changes the text
scale. Normally, it is run when you press Ctrl while moving the
mouse wheel. The text scale is increased when the wheel is moved
downwards, and it is decreased when the wheel is moved upwards.
Font Lock mode is a minor mode, always local to a particular buffer, which assigns faces to (or fontifies) the text in the buffer. Each buffer’s major mode tells Font Lock mode which text to fontify; for instance, programming language modes fontify syntactically relevant constructs like comments, strings, and function names.
Font Lock mode is enabled by default in major modes that support it. To toggle it in the current buffer, type M-x font-lock-mode. A positive numeric argument unconditionally enables Font Lock mode, and a negative or zero argument disables it.
Type M-x global-font-lock-mode to toggle Font Lock mode in all
buffers. To impose this setting for future Emacs sessions, customize
the variable global-font-lock-mode (see Easy Customization Interface), or add the following line to your init file:
(global-font-lock-mode 0)
If you have disabled Global Font Lock mode, you can still enable Font
Lock for specific major modes by adding the function
font-lock-mode to the mode hooks (see Hooks). For example,
to enable Font Lock mode for editing C files, you can do this:
(add-hook 'c-mode-hook 'font-lock-mode)
Font Lock mode uses several specifically named faces to do its job,
including font-lock-string-face, font-lock-comment-face,
and others. The easiest way to find them all is to use M-x
customize-group RET font-lock-faces RET. You can then
use that customization buffer to customize the appearance of these
faces. See Customizing Faces.
Fontifying very large buffers can take a long time. To avoid large delays when a file is visited, Emacs initially fontifies only the visible portion of a buffer. As you scroll through the buffer, each portion that becomes visible is fontified as soon as it is displayed; this type of Font Lock is called Just-In-Time (or JIT) Lock. You can control how JIT Lock behaves, including telling it to perform fontification while idle, by customizing variables in the customization group ‘jit-lock’. See Customizing Specific Items.
The information that major modes use for determining which parts of buffer text to fontify and what faces to use can be based on several different ways of analyzing the text:
“Traditional” methods of providing font-lock information are based on regular-expression search and on syntactic analysis using syntax tables built into Emacs. This subsection describes the use and customization of font-lock for major modes which use these traditional methods.
You can control the amount of fontification applied by Font Lock
mode by customizing the variable font-lock-maximum-decoration,
for major modes that support this feature. The value of this variable
should be a number (with 1 representing a minimal amount of
fontification; some modes support levels as high as 3); or t,
meaning “as high as possible” (the default). To be effective for a
given file buffer, the customization of
font-lock-maximum-decoration should be done before the
file is visited; if you already have the file visited in a buffer when
you customize this variable, kill the buffer and visit the file again
after the customization.
You can also specify different numbers for particular major modes; for example, to use level 1 for C/C++ modes, and the default level otherwise, use the value
'((c-mode . 1) (c++-mode . 1)))
Comment and string fontification (or “syntactic” fontification) relies on analysis of the syntactic structure of the buffer text. For the sake of speed, some modes, including Lisp mode, rely on a special convention: an open-parenthesis or open-brace in the leftmost column always defines the beginning of a defun, and is thus always outside any string or comment. Therefore, you should avoid placing an open-parenthesis or open-brace in the leftmost column, if it is inside a string or comment. See Left Margin Convention, for details.
Font Lock highlighting patterns already exist for most modes, but
you may want to fontify additional patterns. You can use the function
font-lock-add-keywords, to add your own highlighting patterns
for a particular mode. For example, to highlight ‘FIXME:’ words
in C comments, use this:
(add-hook 'c-mode-hook
(lambda ()
(font-lock-add-keywords nil
'(("\\<\\(FIXME\\):" 1
font-lock-warning-face t)))))
To remove keywords from the font-lock highlighting patterns, use the
function font-lock-remove-keywords. See Search-based
Fontification in The Emacs Lisp Reference Manual.
Alternatively, you can selectively disable highlighting due to some
keywords by customizing the font-lock-ignore option,
see Customizing Keywords in The Emacs Lisp Reference
Manual.
If your Emacs was built with the tree-sitter library, it can use the
results of parsing the buffer text by that library for the purposes of
fontification. This is usually faster and more accurate than the
“traditional” methods described in the previous subsection, since
the tree-sitter library provides full-blown parsers for programming
languages and other kinds of formatted text which it supports. Major
modes which utilize the tree-sitter library are named
foo-ts-mode, with the ‘-ts-’ part indicating the use
of the library. This subsection documents the Font Lock support based
on the tree-sitter library.
You can control the amount of fontification applied by Font Lock
mode of major modes based on tree-sitter by customizing the variable
treesit-font-lock-level. Its value is a number between 1 and
4:
This level usually fontifies only comments and function names in function definitions.
This level adds fontification of keywords, strings, and data types.
This is the default level; it adds fontification of assignments, numbers, etc.
This level adds everything else that can be fontified: operators, delimiters, brackets, other punctuation, function names in function calls, property look ups, variables, etc.
What exactly constitutes each of the syntactical categories mentioned
above depends on the major mode and the parser grammar used by
tree-sitter for the major-mode’s language. However, in general the
categories follow the conventions of the programming language or the
file format supported by the major mode. The buffer-local value of
the variable treesit-font-lock-feature-list holds the
fontification features supported by a tree-sitter based major mode,
where each sub-list shows the features provided by the corresponding
fontification level.
Once you change the value of treesit-font-lock-level via
M-x customize-variable (see Customizing Specific Items), it
takes effect immediately in all the existing buffers and for files you
visit in the future in the same session.
Semantic highlighting is feature in which an editor uses some kind of semantic analysis to understand a program’s source code, and communicates useful information about the meaning of different tokens to the user by highlighting these tokens according to their specific role in the program.
Semantic highlighting is more sophisticated than traditional “syntax highlighting”, which only considers the syntactic role of a token, i.e., how it affects the code’s parsing, unlike semantic analysis which takes into account the token’s effect on the program’s execution. For example, a semantic highlighting implementation may be able to tell apart local and global variables and give distinct highlighting to each category, even though the language’s syntax doesn’t make such a distinction. Semantic highlighting is especially beneficial in languages in which syntactic constructs can mean completely different things depending on the context in which they occur, such as Lisp and Prolog. In such languages, syntactic analysis alone misses a lot of important information that coders need to reason about their programs.
Some language servers provide semantic highlighting information, which Emacs can leverage via its LSP client, Eglot. See Eglot Features in Eglot: The Emacs LSP Client.
Additionally, Emacs implements semantic highlighting for Emacs Lisp as
an optional feature of emacs-lisp-mode (see Executing Lisp Expressions).
To enable it, customize the option elisp-fontify-semantically to
a non-nil value. The rest of this subsection describes the use
of this Emacs Lisp-specific semantic highlighting support.
When elisp-fontify-semantically is enabled,
emacs-lisp-mode analyzes your code and highlights symbols
according to their semantic roles, as part of the mode’s usual Font Lock
highlighting (see Font Lock mode). It doesn’t affect the highlighting of
strings, comments and other syntactic elements such as brackets;
elisp-fontify-semantically only affects highlighting of symbols.
The semantic analysis assigns to each symbol a symbol role, such
as “function”, “local variable”, “face name”, etc. Each symbol
role has an associated face property, which is applied to symbols with
that role during semantic highlighting. By default, most of these faces
inherit from appropriate font-lock-* faces. For example,
locally-bound variables get the elisp-bound-variable face, which
inherits from font-lock-variable-use-face.
The semantic analysis can differentiate between more than 50 such symbol roles,
but you don’t need to memorize the appearance of so many faces to
leverage semantic highlighting: you can hover over an highlighted symbol
with the mouse to see a tooltip with the exact role Emacs inferred for
that symbol (see Tooltips). If you want to disable this extra
information, customize elisp-add-help-echo to the nil value.
There are a few more points you should keep in mind when using
elisp-fontify-semantically:
electric-pair-mode to keep your code syntactically
correct while you edit it. See Matching Parentheses.
elisp-scope-safe-macro-p for more
information about which macros Emacs considers safe to expand for
analysis. The user option elisp-scope-safe-macros controls which
macros are safe to expand during analysis in untrusted buffers.
Highlight Changes mode is a minor mode that highlights the parts of the buffer that were changed most recently, by giving that text a different face. To enable or disable Highlight Changes mode, use M-x highlight-changes-mode.
Hi Lock mode is a minor mode that highlights text that matches
regular expressions you specify. For example, you can use it to
highlight all the references to a certain variable in a program source
file, highlight certain parts in a voluminous output of some program,
or highlight certain names in an article. To enable or disable Hi
Lock mode, use the command M-x hi-lock-mode. To enable Hi Lock
mode for all buffers, use M-x global-hi-lock-mode or place
(global-hi-lock-mode 1) in your .emacs file.
Hi Lock mode works like Font Lock mode (see Font Lock mode), except that you specify explicitly the regular expressions to highlight. You can control them with the following commands. (The key bindings below that begin with C-x w are deprecated in favor of the global M-s h bindings, and will be removed in some future Emacs version.)
Highlight text that matches regexp using face face
(highlight-regexp). The highlighting will remain as long as
the buffer is loaded. For example, to highlight all occurrences of
the word “whim” using the default face (a yellow background), type
M-s h r whim RET RET. Any face can be used for
highlighting, Hi Lock provides several of its own and these are
pre-loaded into a list of default values. While being prompted for a
face use M-n and M-p to cycle through them. A prefix
numeric argument limits the highlighting to the corresponding
subexpression.
Setting the option hi-lock-auto-select-face to a non-nil
value causes this command (and other Hi Lock commands that read faces)
to automatically choose the next face from the default list without
prompting.
You can use this command multiple times, specifying various regular expressions to highlight in different ways.
Unhighlight regexp (unhighlight-regexp). If you invoke
this from the menu, you select the expression to unhighlight from a
list. If you invoke this from the keyboard, you use the minibuffer.
It will show the most recently added regular expression; use M-n
to show the next older expression and M-p to select the next
newer expression. (You can also type the expression by hand, with
completion.) When the expression you want to unhighlight appears in
the minibuffer, press RET to exit the minibuffer and
unhighlight it.
Highlight entire lines containing a match for regexp, using face
face (highlight-lines-matching-regexp).
Highlight matches of phrase, using face face
(highlight-phrase). phrase can be any regexp,
but spaces will be replaced by matches to whitespace and
initial lower-case letters will become case insensitive.
Highlight the symbol found near point, using the next available face
(highlight-symbol-at-point).
Insert all the current highlighting regexp/face pairs into the buffer
at point, with comment delimiters to prevent them from changing your
program. (This key binding runs the
hi-lock-write-interactive-patterns command.)
These patterns are extracted from the comments, if appropriate, if you
invoke M-x hi-lock-find-patterns, or if you visit the file while
Hi Lock mode is enabled (since that runs hi-lock-find-patterns).
Extract regexp/face pairs from comments in the current buffer
(hi-lock-find-patterns). Thus, you can enter patterns
interactively with highlight-regexp, store them into the file
with hi-lock-write-interactive-patterns, edit them (perhaps
including different faces for different parenthesized parts of the
match), and finally use this command (hi-lock-find-patterns) to
have Hi Lock highlight the edited patterns.
The variable hi-lock-file-patterns-policy controls whether Hi
Lock mode should automatically extract and highlight patterns found in a
file when it is visited. Its value can be nil (never highlight),
ask (query the user), or a function. If it is a function,
hi-lock-find-patterns calls it with the patterns as argument; if
the function returns non-nil, the patterns are used. The default
is ask. Note that patterns are always highlighted if you call
hi-lock-find-patterns directly, regardless of the value of this
variable.
Also, hi-lock-find-patterns does nothing if the current major
mode’s symbol is a member of the list hi-lock-exclude-modes.
On graphical displays, each Emacs window normally has narrow
fringes on the left and right edges. The fringes are used to
display symbols that provide information about the text in the window.
You can type M-x fringe-mode to toggle display of the fringes or
to modify their width. This command affects fringes in all frames; to
modify fringes on the selected frame only, use M-x
set-fringe-style. You can make your changes to the fringes permanent
by customizing the variable fringe-mode.
The most common use of the fringes is to indicate a continuation line (see Continuation Lines). When one line of text is split into multiple screen lines, the left fringe shows a curving arrow for each screen line except the first, indicating that this is not the real beginning. The right fringe shows a curving arrow for each screen line except the last, indicating that this is not the real end. If the line’s direction is right-to-left (see Bidirectional Editing), the meanings of the curving arrows in the fringes are swapped.
The fringes indicate line truncation (see Line Truncation) with short horizontal arrows meaning there’s more text on this line which is scrolled horizontally out of view. Clicking the mouse on one of the arrows scrolls the display horizontally in the direction of the arrow.
The fringes can also indicate other things, such as buffer boundaries (see Displaying Boundaries), unused lines near the end of the window (see indicate-empty-lines), and where a program you are debugging is executing (see Running Debuggers Under Emacs).
The fringe is also used for drawing the cursor, if the current line
is exactly as wide as the window and point is at the end of the line.
To disable this, change the variable
overflow-newline-into-fringe to nil; this causes Emacs
to continue or truncate lines that are exactly as wide as the window.
If you customize fringe-mode to remove the fringes on one or
both sides of the window display, the features that display on the
fringe are not available. Indicators of line continuation and
truncation are an exception: when fringes are not available, Emacs
uses the leftmost and rightmost character cells to indicate
continuation and truncation with special ASCII characters, see
Continuation Lines, and Line Truncation. This reduces the
width available for displaying text on each line, because the
character cells used for truncation and continuation indicators are
reserved for that purpose. Since buffer text can include
bidirectional text, and thus both left-to-right and right-to-left
paragraphs (see Bidirectional Editing), removing only one of the
fringes still reserves two character cells, one on each side of the
window, for truncation and continuation indicators, because these
indicators are displayed on opposite sides of the window in
right-to-left paragraphs.
Emacs can display an indication of the fill-column position
(see Explicit Fill Commands). The fill-column indicator is a useful
functionality especially in prog-mode and its descendants
(see Major Modes) to indicate the position of a specific column
that has some special meaning for formatting the source code of a
program. This assumes the buffer uses a fixed-pitch font, where all
the characters (with the possible exception of double-width
characters) have the same width on display. If the buffer uses
variable-pitch fonts, the fill-column indicators on different lines
might appear unaligned.
To activate the fill-column indication display, use the minor modes
display-fill-column-indicator-mode and
global-display-fill-column-indicator-mode, which enable
the indicator locally or globally, respectively.
Alternatively, you can set the two buffer-local variables
display-fill-column-indicator and
display-fill-column-indicator-character to activate the
indicator and control the character used for the indication. Note
that both variables must be non-nil for the indication to be
displayed. (Turning on the minor mode sets both these variables.)
There are 2 buffer local variables and a face to customize this mode:
display-fill-column-indicator-column ¶Specifies the column number where the indicator should be set. It can
take positive numerical values for the column, or the special value
t, which means that the value of the variable
fill-column will be used.
Any other value disables the indicator. The default value is t.
display-fill-column-indicator-character ¶Specifies the character used for the indicator. This character can be
any valid character including Unicode ones if the font supports them.
The value nil disables the indicator. When the mode is enabled
through the functions display-fill-column-indicator-mode or
global-display-fill-column-indicator-mode, they will use the
character specified by this variable, if it is non-nil;
otherwise Emacs will use the character U+2502 BOX DRAWINGS LIGHT VERTICAL,
falling back to ‘|’ if U+2502 cannot be displayed.
fill-column-indicator ¶Specifies the face used to display the indicator. It inherits its
default values from the face shadow, but without background
color. To change the indicator color, you need only set the foreground
color of this face.
On graphical displays, Emacs can indicate the buffer boundaries in the fringes. If you enable this feature, the first line and the last line are marked with angle images in the fringes. This can be combined with up and down arrow images which say whether it is possible to scroll the window.
The buffer-local variable indicate-buffer-boundaries controls
how the buffer boundaries and window scrolling is indicated in the
fringes. If the value is left or right, both angle and
arrow bitmaps are displayed in the left or right fringe, respectively.
If value is an alist (see Association Lists in the Emacs
Lisp Reference Manual), each element (indicator .
position) specifies the position of one of the indicators. The
indicator must be one of top, bottom, up,
down, or t which specifies the default position for the
indicators not present in the alist. The position is one of
left, right, or nil which specifies not to show
this indicator.
For example, ((top . left) (t . right)) places the top angle
bitmap in left fringe, the bottom angle bitmap in right fringe, and
both arrow bitmaps in right fringe. To show just the angle bitmaps in
the left fringe, but no arrow bitmaps, use ((top . left)
(bottom . left)).
It is easy to leave unnecessary spaces at the end of a line, or empty lines at the end of a buffer, without realizing it. In most cases, this trailing whitespace has no effect, but sometimes it can be a nuisance.
You can make trailing whitespace at the end of a line visible by
setting the buffer-local variable show-trailing-whitespace to
t. Then Emacs displays trailing whitespace, using the face
trailing-whitespace.
This feature does not apply when point is at the end of the line containing the whitespace. Strictly speaking, that is trailing whitespace nonetheless, but displaying it specially in that case looks ugly while you are typing in new text. In this special case, the location of point is enough to show you that the spaces are present.
Type M-x delete-trailing-whitespace to delete all trailing
whitespace. This command deletes all extra spaces at the end of each
line in the buffer, and all empty lines at the end of the buffer; to
ignore the latter, change the variable delete-trailing-lines to
nil. If the region is active, the command instead deletes
extra spaces at the end of each line in the region. If you enable the
buffer-local mode delete-trailing-whitespace-mode, Emacs will
automatically invoke delete-trailing-whitespace each time you
save the buffer.
On graphical displays, Emacs can indicate unused lines at the end of
the window with a small image in the left fringe (see Window Fringes).
The image appears for screen lines that do not correspond to any
buffer text, so blank lines at the end of the buffer stand out because
they lack this image. To enable this feature, set the buffer-local
variable indicate-empty-lines to a non-nil value. You
can enable or disable this feature for all new buffers by setting the
default value of this variable, e.g., (setq-default
indicate-empty-lines t).
Whitespace mode is a buffer-local minor mode that lets you
visualize many kinds of whitespace in the buffer, by either
drawing the whitespace characters with a special face or displaying
them as special glyphs. To toggle this mode, type M-x
whitespace-mode. The kinds of whitespace visualized are determined
by the list variable whitespace-style. Individual elements in
that list can be toggled on or off in the current buffer by typing
M-x whitespace-toggle-options. Here is a partial list
of possible elements (see the variable’s documentation for the full
list):
faceEnable all visualizations which use special faces. This element has a
special meaning: if it is absent from the list, none of the other
visualizations take effect except space-mark, tab-mark,
and newline-mark.
trailingHighlight trailing whitespace.
tabsHighlight tab characters.
spacesHighlight space and non-breaking space characters.
lines ¶Highlight lines longer than 80 columns. To change the column limit,
customize the variable whitespace-line-column.
newlineHighlight newlines.
missing-newline-at-eofHighlight the final character if the buffer doesn’t end with a newline character.
emptyHighlight empty lines at the beginning and/or end of the buffer.
big-indent ¶Highlight too-deep indentation. By default any sequence of at least 4
consecutive tab characters or 32 consecutive space characters is
highlighted. To change that, customize the regular expression
whitespace-big-indent-regexp.
space-markDraw space and non-breaking characters with a special glyph.
tab-markDraw tab characters with a special glyph.
newline-markDraw newline characters with a special glyph.
Global Whitespace mode is a global minor mode that lets you visualize whitespace in all buffers. To toggle individual features, use M-x global-whitespace-toggle-options.
Emacs has the ability to hide lines indented more than a given number of columns. You can use this to get an overview of a part of a program.
To hide lines in the current buffer, type C-x $
(set-selective-display) with a numeric argument n. Then
lines with at least n columns of indentation disappear from the
screen. The only indication of their presence is that three dots
(‘…’) appear at the end of each visible line that is
followed by one or more hidden ones.
The commands C-n and C-p move across the hidden lines as if they were not there.
The hidden lines are still present in the buffer, and most editing commands see them as usual, so you may find point in the middle of the hidden text. When this happens, the cursor appears at the end of the previous line, after the three dots. If point is at the end of the visible line, before the newline that ends it, the cursor appears before the three dots.
To make all lines visible again, type C-x $ with no argument.
If you set the variable selective-display-ellipses to
nil, the three dots do not appear at the end of a line that
precedes hidden lines. Then there is no visible indication of the
hidden lines. This variable becomes local automatically when set.
See also Outline Mode for another way to hide part of the text in a buffer.
The buffer percentage pos indicates the percentage of the buffer above the top of the window. You can additionally display the size of the buffer by typing M-x size-indication-mode to turn on Size Indication mode. The size will be displayed immediately following the buffer percentage like this:
pos of size
Here size is the human readable representation of the number of characters in the buffer, which means that ‘k’ for 10^3, ‘M’ for 10^6, ‘G’ for 10^9, etc., are used to abbreviate.
The current line number of point appears in the mode line when Line Number mode is enabled. Use the command M-x line-number-mode to turn this mode on and off; normally it is on. The line number appears after the buffer percentage pos, with the letter ‘L’ to indicate what it is.
Similarly, you can display the current column number by turning on Column Number mode with M-x column-number-mode. The column number is indicated by the letter ‘C’. However, when both of these modes are enabled, the line and column numbers are displayed in parentheses, the line number first, rather than with ‘L’ and ‘C’. For example: ‘(561,2)’. See Minor Modes, for more information about minor modes and about how to use these commands.
In Column Number mode, the displayed column number counts from zero
starting at the left margin of the window. If you would prefer for
the displayed column number to count from one, you may set
column-number-indicator-zero-based to nil.
If you have narrowed the buffer (see Narrowing), the displayed
line number is relative to the accessible portion of the buffer.
Thus, it isn’t suitable as an argument to goto-line. (The
command what-line shows the line number relative to the whole
file.) You can use goto-line-relative command to move point to
the line relative to the accessible portion of the narrowed buffer.
If the buffer is very large (larger than the value of
line-number-display-limit), Emacs won’t compute the line
number, because that would be too slow; therefore, the line number
won’t appear on the mode-line. To remove this limit, set
line-number-display-limit to nil.
Line-number computation can also be slow if the lines in the buffer
are too long. For this reason, Emacs doesn’t display line numbers if
the average width, in characters, of lines near point is larger than
the value of line-number-display-limit-width. The default
value is 200 characters.
Emacs can optionally display the time and system load in all mode
lines. To enable this feature, type M-x display-time or customize
the option display-time-mode. The information added to the mode
line looks like this:
hh:mmPM l.ll
Here hh and mm are the hour and minute, followed always by
‘AM’ or ‘PM’. l.ll is the average number, collected
for the last few minutes, of processes in the whole system that were
either running or ready to run (i.e., were waiting for an available
processor). (Some fields may be missing if your operating system
cannot support them.) If you prefer time display in 24-hour format,
set the variable display-time-24hr-format to t.
The word ‘Mail’ appears after the load level if there is mail
for you that you have not read yet. On graphical displays, you can
use an icon instead of ‘Mail’ by customizing
display-time-use-mail-icon; this may save some space on the
mode line. You can customize display-time-mail-face to make
the mail indicator prominent. Use display-time-mail-file to
specify the mail file to check, or set
display-time-mail-directory to specify the directory to check
for incoming mail (any nonempty regular file in the directory is
considered to be newly arrived mail).
When running Emacs on a laptop computer, you can display the battery
charge on the mode-line, by using the command
display-battery-mode or customizing the variable
display-battery-mode. The variable
battery-mode-line-format determines the way the battery charge
is displayed; the exact mode-line message depends on the operating
system, and it usually shows the current battery charge as a
percentage of the total charge. The functions in
battery-update-functions are run after updating the mode line,
and can be used to trigger actions based on the battery status.
On graphical displays, the mode line is drawn as a 3D box. If you
don’t like this effect, you can disable it by customizing the
mode-line face and setting its box attribute to
nil. See Customizing Faces.
By default, the mode line of nonselected windows is displayed in a
different face, called mode-line-inactive. Only the selected
window is displayed in the mode-line face. This helps show
which window is selected. When the minibuffer is selected, since
it has no mode line, the window from which you activated the minibuffer
has its mode line displayed using mode-line; as a result,
ordinary entry to the minibuffer does not change any mode lines.
You can disable use of mode-line-inactive by setting variable
mode-line-in-non-selected-windows to nil; then all mode
lines are displayed in the mode-line face.
You can customize the mode line display for each of the end-of-line
formats by setting each of the variables eol-mnemonic-unix,
eol-mnemonic-dos, eol-mnemonic-mac, and
eol-mnemonic-undecided to the strings you prefer.
Some modes put a lot of data in the mode line, pushing elements at the
end of the mode line off to the right. Emacs can “compress” the mode
line if the mode-line-compact variable is non-nil by
turning stretches of spaces into a single space. If this variable is
long, this is only done when the mode line is wider than the
currently selected window. (This computation is approximate, based on
the number of characters, and not their displayed width.) This variable
can be buffer-local to only compress mode-lines in certain buffers. To
further “compress” the mode line, you may customize the
mode-line-collapse-minor-modes option to a non-nil value,
and Emacs will hide some minor mode indicators on the mode line by
collapsing them into a single clickable button.
By default, most buffers display a mode line, but if the mode line is
not useful in a buffer, you can use the command M-x mode-line-invisible-mode to hide the mode line in the current buffer,
the mode line remains hidden until this command is called again. To
always hide the mode line when entering to a major mode, add
mode-line-invisible-mode to a hook (see Hooks).
Most characters are printing characters: when they appear in a buffer, they are displayed literally on the screen. Printing characters include ASCII numbers, letters, and punctuation characters, as well as many non-ASCII characters.
The ASCII character set contains non-printing control
characters. Two of these are displayed specially: the newline
character (Unicode code point U+000A) is displayed by starting
a new line, while the tab character (U+0009) is displayed as a
space that extends to the next tab stop column (normally every 8
columns). The number of spaces per tab is controlled by the
buffer-local variable tab-width, which must have an integer
value between 1 and 1000, inclusive. Note that the way the tab
character in the buffer is displayed has nothing to do with the
definition of TAB as a command.
Other ASCII control characters, whose codes are below
U+0020 (octal 40, decimal 32), are displayed as a caret
(‘^’) followed by the non-control version of the character, with
the escape-glyph face. For instance, the ‘control-A’
character, U+0001, is displayed as ‘^A’.
The raw bytes with codes U+0080 (octal 200) through
U+009F (octal 237) are displayed as octal escape
sequences, with the escape-glyph face. For instance,
character code U+0098 (octal 230) is displayed as ‘\230’.
If you change the buffer-local variable ctl-arrow to
nil, the ASCII control characters are also displayed
as octal escape sequences instead of caret escape sequences. (You can
also request that raw bytes be shown in hex, see display-raw-bytes-as-hex.)
Some non-ASCII characters have the same appearance as an
ASCII space or hyphen (minus) character. Such characters
can cause problems if they are entered into a buffer without your
realization, e.g., by yanking; for instance, source code compilers
typically do not treat non-ASCII spaces as whitespace
characters. To deal with this problem, Emacs displays such characters
specially: it displays U+00A0 NO-BREAK SPACE and other
characters from the Unicode horizontal space class with the
nobreak-space face, and it displays U+00AD SOFT
HYPHEN, U+2010 HYPHEN, and U+2011 NON-BREAKING
HYPHEN with the nobreak-hyphen face. To disable this, change
the variable nobreak-char-display to nil. If you give
this variable a non-nil and non-t value, Emacs instead
displays such characters as a highlighted backslash followed by a
space or hyphen.
You can customize the way any particular character code is displayed by means of a display table. See Display Tables in The Emacs Lisp Reference Manual.
On graphical displays, some characters may have no glyphs in any of
the fonts available to Emacs. These glyphless characters are
normally displayed as boxes containing the hexadecimal character code.
Similarly, on text terminals, characters that cannot be displayed
using the terminal encoding (see Coding Systems for Terminal I/O) are normally
displayed as question signs. You can control the display method by
customizing the variable glyphless-char-display-control. You
can also customize the glyphless-char face to make these
characters more prominent on display. See Glyphless Character Display in The Emacs Lisp Reference Manual,
for details.
The glyphless-display-mode minor mode can be used to toggle
the display of glyphless characters in the current buffer. The
glyphless characters will be displayed as boxes with acronyms of their
names inside.
Emacs tries to determine if the curved quotes ‘ and ’
can be displayed on the current display. By default, if this seems to
be so, then Emacs will translate the ASCII quotes (‘`’ and ‘'’), when they appear in messages and help texts, to these
curved quotes. You can influence or inhibit this translation by
customizing the user option text-quoting-style (see Keys in
Documentation in The Emacs Lisp Reference Manual).
If the curved quotes ‘, ’, “, and ” are
known to look just like ASCII characters, they are shown
with the homoglyph face. Curved quotes that are known not to
be displayable are shown as their ASCII approximations
‘`’, ‘'’, and ‘"’ with the homoglyph face.
On a text terminal, the cursor’s appearance is controlled by the
terminal, largely out of the control of Emacs. Some terminals offer
two different cursors: a visible static cursor, and a very
visible blinking cursor. By default, Emacs uses the very visible
cursor, and switches to it when you start or resume Emacs. If the
variable visible-cursor is nil when Emacs starts or
resumes, it uses the normal cursor.
On a graphical display and many Xterm-compatible text terminals, the
color and shape of the text cursor can be altered. To customize its
color, change the :background attribute of the face named
cursor (see Customizing Faces). (The other attributes of
this face have no effect; the text shown under the cursor is drawn using
the frame’s background color.) To change its shape, customize the
buffer-local variable cursor-type; possible values are box
(the default), (box . size) (box cursor becoming a hollow
box under masked images larger than size pixels in either
dimension), hollow (a hollow box), bar (a vertical bar),
(bar . n) (a vertical bar n pixels wide), hbar
(a horizontal bar), (hbar . n) (a horizontal bar n
pixels tall), or nil (no cursor at all).
On Xterm-compatible text terminals cursor customization is controlled
by the user option xterm-update-cursor. Valid values are
t to update the cursor’s color and shape, type to update
the cursor’s shape only, color to update the cursor’s color only,
and nil to not update the cursor’s appearance. Text terminals
can not display a hollow box and instead use a filled box. Similarly,
all text terminals ignore the pixel sizes for bar and
hbar.
To make the cursor even more visible, you can use HL Line mode, a minor mode that highlights the line containing point. Use M-x hl-line-mode to enable or disable it in the current buffer. M-x global-hl-line-mode enables or disables the same mode globally.
The remaining controls only work on graphical displays where Emacs can fully control the way the cursor appears.
By default, the cursor stops blinking after 10 blinks, if Emacs does
not get any input during that time; any input event restarts the
count. You can customize the variable blink-cursor-blinks to
control that: its value says how many times to blink without input
before stopping. Setting that variable to a zero or negative value
will make the cursor blink forever. To disable cursor blinking
altogether, change the variable blink-cursor-mode to nil
(see Easy Customization Interface), or add the line
(blink-cursor-mode 0)
to your init file. Alternatively, you can change how the cursor
looks when it blinks off by customizing the list variable
blink-cursor-alist. Each element in the list should have the
form (on-type . off-type); this means that if the
cursor is displayed as on-type when it blinks on (where
on-type is one of the cursor types described above), then it is
displayed as off-type when it blinks off.
Some characters, such as tab characters, are extra wide. When
the cursor is positioned over such a character, it is normally drawn
with the default character width. You can make the cursor stretch to
cover wide characters, by changing the variable
x-stretch-cursor to a non-nil value.
The cursor normally appears in non-selected windows as a
non-blinking hollow box. (For a bar cursor, it instead appears as a
thinner bar.) To turn off cursors in non-selected windows, change the
variable cursor-in-non-selected-windows to nil.
As an alternative to continuation (see Continuation Lines), Emacs can display long lines by truncation. This means that all the characters that do not fit in the width of the screen or window do not appear at all. On graphical displays, a small straight arrow in the fringe indicates truncation at either end of the line. On text terminals, this is indicated with ‘$’ signs in the rightmost and/or leftmost columns.
Horizontal scrolling automatically causes line truncation
(see Horizontal Scrolling). You can explicitly enable line
truncation for a particular buffer with the command C-x x t
(toggle-truncate-lines). This works by locally changing the
variable truncate-lines. If that variable is non-nil,
long lines are truncated; if it is nil, they are continued onto
multiple screen lines. Setting the variable truncate-lines in
any way makes it local to the current buffer; until that time, the
default value, which is normally nil, is in effect.
Since line truncation and word wrap (described in the next section)
are contradictory, toggle-truncate-lines disables word wrap
when it turns on line truncation.
If a split window becomes too narrow, Emacs may automatically enable
line truncation. See Splitting Windows, for the variable
truncate-partial-width-windows which controls this.
Another alternative to ordinary line continuation (see Continuation Lines) is to use word wrap. Here, each long logical line is divided into two or more screen lines, or “visual lines”, like in ordinary line continuation. However, Emacs attempts to wrap the line at word boundaries near the right window edge. (If the line’s direction is right-to-left, it is wrapped at the left window edge instead.) This makes the text easier to read, as wrapping does not occur in the middle of words.
Word wrap is enabled by Visual Line mode, an optional minor mode. To turn on Visual Line mode in the current buffer, type M-x visual-line-mode; repeating this command turns it off. You can also turn on Visual Line mode using the menu bar: in the Options menu, select the ‘Line Wrapping in this Buffer’ submenu, followed by the ‘Word Wrap (Visual Line mode)’ menu item. While Visual Line mode is enabled, the mode line shows the string ‘wrap’ in the mode display. The command M-x global-visual-line-mode toggles Visual Line mode in all buffers.
Since word wrap and line truncation (described in the previous
section) are contradictory, turning on visual-line-mode
disables line truncation.
In Visual Line mode, some editing commands work on screen lines
instead of logical lines: C-a (beginning-of-visual-line)
moves to the beginning of the screen line, C-e
(end-of-visual-line) moves to the end of the screen line, and
C-k (kill-visual-line) kills text to the end of the
screen line.
To move by logical lines, use the commands M-x next-logical-line and M-x previous-logical-line. These move point to the next logical line and the previous logical line respectively, regardless of whether Visual Line mode is enabled. If you use these commands frequently, it may be convenient to assign key bindings to them. See Rebinding Keys in Your Init File.
By default, word-wrapped lines do not display fringe indicators.
Visual Line mode is often used to edit files that contain many long
logical lines, so having a fringe indicator for each wrapped line
would be visually distracting. You can change this by customizing the
variable visual-line-fringe-indicators.
By default, Emacs only breaks lines after whitespace characters like
SPC and TAB, but does not break after whitespace
characters like EN QUAD. Emacs provides a minor mode called
word-wrap-whitespace-mode that switches on word wrapping in the
current mode, and sets up which characters to wrap lines on based on
the word-wrap-whitespace-characters user option. There’s also
a globalized version of that mode called
global-word-wrap-whitespace-mode.
Only breaking after whitespace character produces incorrect
results when CJK and Latin text are mixed
together (because CJK characters don’t use whitespace to separate
words). You can customize the option word-wrap-by-category to
allow Emacs to break lines after any character with ‘|’ category
(see Categories in the Emacs Lisp Reference Manual), which
provides better support for CJK characters. Also, if this variable is
set using Customize, Emacs automatically loads kinsoku.el.
When kinsoku.el is loaded, Emacs respects kinsoku rules when
breaking lines. That means characters with the ‘>’ category don’t
appear at the beginning of a line (e.g., U+FF0C FULLWIDTH COMMA), and
characters with the ‘<’ category don’t appear at the end of a line
(e.g., U+300A LEFT DOUBLE ANGLE BRACKET). You can view the category
set of a character using the commands char-category-set and
category-set-mnemonics, or by typing C-u C-x = with point
on the character and looking at the “category” section in the
report. You can add categories to a character using the command
modify-category-entry.
This section describes variables that control miscellaneous aspects of the appearance of the Emacs screen. Beginning users can skip it.
If you want to have Emacs display line numbers for every line in the
buffer, customize the buffer-local variable
display-line-numbers; it is nil by default. This
variable can have several different values to support various modes of
line-number display:
tDisplay (an absolute) line number before each non-continuation screen line that displays buffer text. If the line is a continuation line, or if the entire screen line displays a display or an overlay string, that line will not be numbered.
relativeDisplay relative line numbers before non-continuation lines which show buffer text. The line numbers are relative to the line showing point, so the numbers grow both up and down as lines become farther from the current line.
visualThis value causes Emacs to count lines visually: only lines actually
shown on the display will be counted (disregarding any lines in
invisible parts of text), and lines which wrap to consume more than
one screen line will be numbered that many times. The displayed
numbers are relative, as with relative value above. This is
handy in modes that fold text, such as Outline mode (see Outline Mode), and when you need to move by exact number of screen lines.
Any other non-nil value is treated as t.
The command M-x display-line-numbers-mode provides a
convenient way to turn on display of line numbers. This mode has a globalized
variant, global-display-line-numbers-mode. The user option
display-line-numbers-type controls which sub-mode of
line-number display, described above, these modes will activate.
Note that line numbers are not displayed in the minibuffer and in the
tooltips, even if you turn on display-line-numbers-mode
globally.
When Emacs displays relative line numbers, you can control the number
displayed before the current line, the line showing point. By
default, Emacs displays the absolute number of the current line there,
even though all the other line numbers are relative. If you customize
the variable display-line-numbers-current-absolute to a
nil value, the number displayed for the current line will be
zero. This is handy if you don’t care about the number of the current
line, and want to leave more horizontal space for text in large
buffers.
In a narrowed buffer (see Narrowing) lines are normally numbered
starting at the beginning of the narrowing. However, if you customize
the variable display-line-numbers-widen to a non-nil
value, line numbers will disregard any narrowing and will start at the
first character of the buffer.
If the value of display-line-numbers-offset is non-zero, it is
added to each absolute line number, and lines are counted from the
beginning of the buffer, as if display-line-numbers-widen were
non-nil. It has no effect when set to zero, or when line
numbers are not absolute.
In selective display mode (see Selective Display), and other modes
that hide many lines from display (such as Outline and Org modes), you
may wish to customize the variables
display-line-numbers-width-start and
display-line-numbers-grow-only, or set
display-line-numbers-width to a large enough value, to avoid
occasional miscalculations of space reserved for the line numbers.
The line numbers are displayed in a special face line-number.
The current line number is displayed in a different face,
line-number-current-line, so you can make the current line’s
number have a distinct appearance, which will help locating the line
showing point. Additional faces line-number-major-tick and
line-number-minor-tick can be used to highlight the line numbers
of lines which are a multiple of certain numbers. Customize
display-line-numbers-major-tick and
display-line-numbers-minor-tick respectively to set those
numbers.
The variable line-spacing controls the vertical spacing between
lines. It can be set to an integer (specifying pixels) or a float
(specifying spacing relative to the default frame font height). You can
also set this variable to a cons cell of integers or floats, such as
(top . bottom). When set to a cons cell, the spacing
is distributed above and below the line, allowing for text to be
vertically centered within the line height. See also Line Height in The Emacs Lisp Reference Manual.
If the variable visible-bell is non-nil, Emacs attempts
to make the whole screen blink when it would normally make an audible bell
sound. This variable has no effect if your terminal does not have a way
to make the screen blink.
The variable echo-keystrokes controls the echoing of multi-character
keys; its value is the number of seconds of pause required to cause echoing
to start, or zero, meaning don’t echo at all. The value takes effect when
there is something to echo. See The Echo Area.
If the variable echo-keystrokes-help is non-nil (the
default), the multi-character key sequence echo shown according to
echo-keystrokes will include a short help text about keys which
will invoke describe-prefix-bindings (see Other Help Commands) to show
the list of commands for the prefix you already typed. For a related
help facility, see which-key.
On graphical displays, Emacs displays the mouse pointer as an
hourglass if Emacs is busy. To disable this feature, set the variable
display-hourglass to nil. The variable
hourglass-delay determines the number of seconds of busy
time before the hourglass is shown; the default is 1.
If the mouse pointer lies inside an Emacs frame, Emacs makes it
invisible each time you type a character to insert text, to prevent it
from obscuring the text. (To be precise, the hiding occurs when you
type a self-inserting character. See Inserting Text.) Moving
the mouse pointer makes it visible again. To disable this feature,
set the variable make-pointer-invisible to nil.
On graphical displays, the variable underline-minimum-offset
determines the minimum distance between the baseline and underline, in
pixels, for underlined text. By default, the value is 1; increasing
it may improve the legibility of underlined text for certain fonts.
(However, Emacs will never draw the underline below the current line
area.) The variable x-underline-at-descent-line determines how
to draw underlined text. The default is nil, which means to
draw it at the baseline level of the font; if you change it to
t, Emacs draws the underline at the same height as the font’s
descent line. (If non-default line spacing was specified for the
underlined text, see Line Height in The Emacs Lisp
Reference Manual, Emacs draws the underline below the additional
spacing.)
The variable overline-margin specifies the vertical position
of an overline above the text, including the height of the overline
itself, in pixels; the default is 2.
On some text terminals, bold face and inverse video together result
in text that is hard to read. Call the function
tty-suppress-bold-inverse-default-colors with a non-nil
argument to suppress the effect of bold-face in this case.
Raw bytes are displayed in octal format by default, for example a
byte with a decimal value of 128 is displayed as \200. To
change display to the hexadecimal format of \x80, set the
variable display-raw-bytes-as-hex to t.
Care may be needed when interpreting a raw byte when copying
text from a terminal containing an Emacs session, or when a terminal’s
escape-glyph face looks like the default face. For example, by
default Emacs displays the four characters ‘\’, ‘2’,
‘0’, ‘0’ with the same characters it displays a byte with
decimal value 128. The problem can be worse with hex displays, where
the raw byte 128 followed by the character ‘7’ is displayed as
\x807, which Emacs Lisp reads as the single character U+0807
SAMARITAN LETTER IT; this confusion does not occur with the
corresponding octal display \2007 because octal escapes contain
at most three digits.