7224 lines
309 KiB
Plaintext
7224 lines
309 KiB
Plaintext
@c -*-texinfo-*-
|
||
@c This is part of the GNU Emacs Lisp Reference Manual.
|
||
@c Copyright (C) 1990--1995, 1998--1999, 2001--2024 Free Software
|
||
@c Foundation, Inc.
|
||
@c See the file elisp.texi for copying conditions.
|
||
@node Windows
|
||
@chapter Windows
|
||
|
||
This chapter describes the functions and variables related to Emacs
|
||
windows. @xref{Frames}, for how windows are assigned an area of screen
|
||
available for Emacs to use. @xref{Display}, for information on how text
|
||
is displayed in windows.
|
||
|
||
@menu
|
||
* Basic Windows:: Basic information on using windows.
|
||
* Windows and Frames:: Relating windows to the frame they appear on.
|
||
* Selecting Windows:: The selected window is the one that you edit in.
|
||
* Window Sizes:: Accessing a window's size.
|
||
* Resizing Windows:: Changing the sizes of windows.
|
||
* Preserving Window Sizes:: Preserving the size of windows.
|
||
* Splitting Windows:: Creating a new window.
|
||
* Deleting Windows:: Removing a window from its frame.
|
||
* Recombining Windows:: Preserving the frame layout when splitting and
|
||
deleting windows.
|
||
* Cyclic Window Ordering:: Moving around the existing windows.
|
||
* Buffers and Windows:: Each window displays the contents of a buffer.
|
||
* Switching Buffers:: Higher-level functions for switching to a buffer.
|
||
* Displaying Buffers:: Displaying a buffer in a suitable window.
|
||
* Window History:: Each window remembers the buffers displayed in it.
|
||
* Dedicated Windows:: How to avoid displaying another buffer in
|
||
a specific window.
|
||
* Quitting Windows:: How to restore the state prior to displaying a
|
||
buffer.
|
||
* Side Windows:: Special windows on a frame's sides.
|
||
* Atomic Windows:: Preserving parts of the window layout.
|
||
* Window Point:: Each window has its own location of point.
|
||
* Window Start and End:: Buffer positions indicating which text is
|
||
on-screen in a window.
|
||
* Textual Scrolling:: Moving text up and down through the window.
|
||
* Vertical Scrolling:: Moving the contents up and down on the window.
|
||
* Horizontal Scrolling:: Moving the contents sideways on the window.
|
||
* Coordinates and Windows:: Converting coordinates to windows.
|
||
* Mouse Window Auto-selection:: Automatically selecting windows with the mouse.
|
||
* Window Configurations:: Saving and restoring the state of the screen.
|
||
* Window Parameters:: Associating additional information with windows.
|
||
* Window Hooks:: Hooks for scrolling, window size changes,
|
||
redisplay going past a certain point,
|
||
or window configuration changes.
|
||
@end menu
|
||
|
||
|
||
@node Basic Windows
|
||
@section Basic Concepts of Emacs Windows
|
||
@cindex window
|
||
|
||
@cindex multiple windows
|
||
A @dfn{window} is an area of the screen that can be used to display a
|
||
buffer (@pxref{Buffers}). Windows are grouped into frames
|
||
(@pxref{Frames}). Each frame contains at least one window; the user can
|
||
subdivide a frame into multiple, non-overlapping windows to view several
|
||
buffers at once. Lisp programs can use multiple windows for a variety
|
||
of purposes. In Rmail, for example, you can view a summary of message
|
||
titles in one window, and the contents of the selected message in
|
||
another window.
|
||
|
||
@cindex terminal screen
|
||
@cindex screen of terminal
|
||
@cindex window-system window
|
||
Emacs uses the term ``window'' with a different meaning than in
|
||
graphical desktop environments and window systems, such as the X Window
|
||
System. When Emacs is run on X, each graphical X window owned by the
|
||
Emacs process corresponds to one Emacs frame. When Emacs is run on a
|
||
text terminal, each Emacs frame fills the entire terminal screen. In
|
||
either case, the frame may contain one or more Emacs windows. For
|
||
disambiguation, we use the term @dfn{window-system window} when we mean
|
||
the window-system window corresponding to an Emacs frame.
|
||
|
||
@cindex tiled windows
|
||
Unlike X windows, Emacs windows are @dfn{tiled}; they never overlap
|
||
within the area of their frame. When a window is created, resized, or
|
||
deleted, the change in window space is taken from or given to other
|
||
windows on the same frame, so that the total area of the frame is
|
||
unchanged.
|
||
|
||
In Emacs Lisp, windows are represented by a special Lisp object type
|
||
(@pxref{Window Type}).
|
||
|
||
@defun windowp object
|
||
This function returns @code{t} if @var{object} is a window (whether or
|
||
not it displays a buffer). Otherwise, it returns @code{nil}.
|
||
@end defun
|
||
|
||
@cindex live windows
|
||
A @dfn{live window} is one that is actually displaying a buffer in a
|
||
frame.
|
||
|
||
@defun window-live-p object
|
||
This function returns @code{t} if @var{object} is a live window and
|
||
@code{nil} otherwise. A live window is one that displays a buffer.
|
||
@end defun
|
||
|
||
@cindex internal windows
|
||
The windows in each frame are organized into a @dfn{window tree}.
|
||
@xref{Windows and Frames}. The leaf nodes of each window tree are live
|
||
windows---the ones actually displaying buffers. The internal nodes of
|
||
the window tree are @dfn{internal windows}, which are not live.
|
||
|
||
@cindex valid windows
|
||
A @dfn{valid window} is one that is either live or internal. A valid
|
||
window can be @dfn{deleted}, i.e., removed from its frame
|
||
(@pxref{Deleting Windows}); then it is no longer valid, but the Lisp
|
||
object representing it might be still referenced from other Lisp
|
||
objects. A deleted window may be made valid again by restoring a saved
|
||
window configuration (@pxref{Window Configurations}).
|
||
|
||
You can distinguish valid windows from deleted windows with
|
||
@code{window-valid-p}.
|
||
|
||
@defun window-valid-p object
|
||
This function returns @code{t} if @var{object} is a live window, or an
|
||
internal window in a window tree. Otherwise, it returns @code{nil},
|
||
including for the case where @var{object} is a deleted window.
|
||
@end defun
|
||
|
||
The following schematic shows the structure of a live window:
|
||
|
||
@smallexample
|
||
@group
|
||
____________________________________________
|
||
|________________ Tab Line _______________|RD| ^
|
||
|______________ Header Line ______________| | |
|
||
^ |LS|LM|LF| |RF|RM|RS| | |
|
||
| | | | | | | | | | |
|
||
Window | | | | | | | | | Window
|
||
Body | | | | | Window Body | | | | | Total
|
||
Height | | | | | | | | | Height
|
||
| | | | |<- Window Body Width ->| | | | | |
|
||
v |__|__|__|_______________________|__|__|__| | |
|
||
|_________ Horizontal Scroll Bar _________| | |
|
||
|_______________ Mode Line _______________|__| |
|
||
|_____________ Bottom Divider _______________| v
|
||
<---------- Window Total Width ------------>
|
||
|
||
@end group
|
||
@end smallexample
|
||
|
||
@cindex window body
|
||
@cindex body of a window
|
||
@cindex window decorations
|
||
@cindex left and right window decorations
|
||
@cindex top and bottom window decorations
|
||
At the center of that window is the @dfn{body}, where the buffer
|
||
text is displayed. The body can be surrounded by a series of optional
|
||
areas which we will call @dfn{window decorations}. On the left and
|
||
right, from innermost to outermost, these are the left and right
|
||
fringes, denoted by LF and RF (@pxref{Fringes}); the left and right
|
||
margins, denoted by LM and RM in the schematic (@pxref{Display
|
||
Margins}); the left or right vertical scroll bar, only one of which is
|
||
present at any time, denoted by LS and RS (@pxref{Scroll Bars}); and
|
||
the right divider, denoted by RD (@pxref{Window Dividers}). Together
|
||
these are the window's @dfn{left and right decorations}.
|
||
|
||
@cindex text area of a window
|
||
At the top of the window are the tab line and the header line
|
||
(@pxref{Header Lines}). The @dfn{text area} of the window includes
|
||
the header line and the tab line, if they are present in the window.
|
||
At the bottom of the window are the horizontal scroll bar
|
||
(@pxref{Scroll Bars}); the mode line (@pxref{Mode Line Format}); and
|
||
the bottom divider (@pxref{Window Dividers}). Together these form the
|
||
window's @dfn{top and bottom decorations}.
|
||
|
||
There are two special areas omitted in the schematic:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
When any of the fringes is missing, the display engine may use one
|
||
character cell in its place for showing a continuation or truncation
|
||
glyph provided a text line doesn't fit in a window.
|
||
|
||
@item
|
||
When both, the vertical scroll bar and the right divider are missing,
|
||
the display engine usurps one pixel for drawing a vertical divider line
|
||
between this window and the window on its right, provided such a window
|
||
exists. On a text terminal, this divider always occupies an entire
|
||
character cell.
|
||
@end itemize
|
||
|
||
In either case, the resulting artifact is considered part of the
|
||
window's body although its screen space cannot be used for displaying
|
||
buffer text.
|
||
|
||
Note also, that line numbers (and their surrounding whitespace) as
|
||
displayed by @code{display-line-numbers-mode} (@pxref{Display Custom,,,
|
||
emacs, The GNU Emacs Manual}) do not count as decorations either; they
|
||
are part of the window's body too.
|
||
|
||
Internal windows neither show any text nor do they have decorations.
|
||
Hence, the concept of ``body'' does not make sense for them. In fact,
|
||
most functions operating on the body of a window will yield an error
|
||
when applied to an internal window.
|
||
|
||
@cindex minibuffer window
|
||
@cindex tooltip window
|
||
By default, an Emacs frame exhibits one special live window that is
|
||
used for displaying messages and accepting user input---the
|
||
@dfn{minibuffer window} (@pxref{Minibuffer Windows}). Since the
|
||
minibuffer window is used for displaying text, it has a body but it does
|
||
not have a tab or header line or any margins. Finally, a @dfn{tooltip
|
||
window} which is used for displaying a tooltip in a tooltip frame
|
||
(@pxref{Tooltips}) has a body too but no decorations at all.
|
||
|
||
|
||
@node Windows and Frames
|
||
@section Windows and Frames
|
||
|
||
Each window belongs to exactly one frame (@pxref{Frames}). For all
|
||
windows belonging to a specific frame, we sometimes also say that these
|
||
windows are @dfn{owned} by that frame or simply that they are on that
|
||
frame.
|
||
|
||
@defun window-frame &optional window
|
||
This function returns the specified @var{window}'s frame---the frame
|
||
that @var{window} belongs to. If @var{window} is omitted or @code{nil},
|
||
it defaults to the selected window (@pxref{Selecting Windows}).
|
||
@end defun
|
||
|
||
@defun window-list &optional frame minibuffer window
|
||
This function returns a list of all live windows owned by the specified
|
||
@var{frame}. If @var{frame} is omitted or @code{nil}, it defaults to
|
||
the selected frame (@pxref{Input Focus}).
|
||
|
||
The optional argument @var{minibuffer} specifies whether to include the
|
||
minibuffer window (@pxref{Minibuffer Windows}) in that list. If
|
||
@var{minibuffer} is @code{t}, the minibuffer window is included. If
|
||
@code{nil} or omitted, the minibuffer window is included only if it is
|
||
active. If @var{minibuffer} is neither @code{nil} nor @code{t}, the
|
||
minibuffer window is never included.
|
||
|
||
The optional argument @var{window}, if non-@code{nil}, must be a live
|
||
window on the specified frame; then @var{window} will be the first
|
||
element in the returned list. If @var{window} is omitted or @code{nil},
|
||
the window selected within @var{frame} (@pxref{Selecting Windows}) is
|
||
the first element.
|
||
@end defun
|
||
|
||
@cindex window tree
|
||
@cindex root window
|
||
Windows on the same frame are organized into a @dfn{window tree},
|
||
whose leaf nodes are the live windows. The internal nodes of a window
|
||
tree are not live; they exist for the purpose of organizing the
|
||
relationships between live windows. The root node of a window tree is
|
||
called the @dfn{root window}. It is either a live window or an
|
||
internal window. If it is a live window, then the frame has just one
|
||
window besides the minibuffer window, or the frame is a
|
||
minibuffer-only frame, @pxref{Frame Layout}.
|
||
|
||
A minibuffer window (@pxref{Minibuffer Windows}) that is not alone on
|
||
its frame does not have a parent window, so it strictly speaking is not
|
||
part of its frame's window tree. Nonetheless, it is a sibling window of
|
||
the frame's root window, and thus can be reached from the root window via
|
||
@code{window-next-sibling}, see below. Also, the function
|
||
@code{window-tree} described at the end of this section lists the
|
||
minibuffer window alongside the actual window tree.
|
||
|
||
@defun frame-root-window &optional frame-or-window
|
||
This function returns the root window for @var{frame-or-window}. The
|
||
argument @var{frame-or-window} should be either a window or a frame;
|
||
if omitted or @code{nil}, it defaults to the selected frame. If
|
||
@var{frame-or-window} is a window, the return value is the root window
|
||
of that window's frame.
|
||
@end defun
|
||
|
||
@cindex parent window
|
||
@cindex child window
|
||
@cindex sibling window
|
||
When a live window is split (@pxref{Splitting Windows}), there are two
|
||
live windows where previously there was one. One of these is
|
||
represented by the same Lisp window object as the original window, and
|
||
the other is represented by a newly-created Lisp window object. Both of
|
||
these live windows become leaf nodes of the window tree, as @dfn{child
|
||
windows} of a single internal window. If necessary, Emacs automatically
|
||
creates this internal window, which is also called the @dfn{parent
|
||
window}, and assigns it to the appropriate position in the window tree.
|
||
The set of windows that share the same parent are called @dfn{siblings}.
|
||
|
||
@cindex parent window
|
||
@defun window-parent &optional window
|
||
This function returns the parent window of @var{window}. If
|
||
@var{window} is omitted or @code{nil}, it defaults to the selected
|
||
window. The return value is @code{nil} if @var{window} has no parent
|
||
(i.e., it is a minibuffer window or the root window of its frame).
|
||
@end defun
|
||
|
||
A parent window always has at least two child windows. If this number
|
||
were to fall to one as a result of window deletion (@pxref{Deleting
|
||
Windows}), Emacs automatically deletes the parent window too, and its
|
||
sole remaining child window takes its place in the window tree.
|
||
|
||
A child window can be either a live window, or an internal window
|
||
(which in turn would have its own child windows). Therefore, each
|
||
internal window can be thought of as occupying a certain rectangular
|
||
@dfn{screen area}---the union of the areas occupied by the live windows
|
||
that are ultimately descended from it.
|
||
|
||
@cindex window combination
|
||
@cindex vertical combination
|
||
@cindex horizontal combination
|
||
For each internal window, the screen areas of the immediate children
|
||
are arranged either vertically or horizontally (never both). If the
|
||
child windows are arranged one above the other, they are said to form
|
||
a @dfn{vertical combination}; if they are arranged side by side, they
|
||
are said to form a @dfn{horizontal combination}. Consider the
|
||
following example:
|
||
|
||
@smallexample
|
||
@group
|
||
______________________________________
|
||
| ______ ____________________________ |
|
||
|| || __________________________ ||
|
||
|| ||| |||
|
||
|| ||| |||
|
||
|| ||| |||
|
||
|| |||____________W4____________|||
|
||
|| || __________________________ ||
|
||
|| ||| |||
|
||
|| ||| |||
|
||
|| |||____________W5____________|||
|
||
||__W2__||_____________W3_____________ |
|
||
|__________________W1__________________|
|
||
|
||
@end group
|
||
@end smallexample
|
||
|
||
@noindent
|
||
The root window of this frame is an internal window, @var{W1}. Its
|
||
child windows form a horizontal combination, consisting of the live
|
||
window @var{W2} and the internal window @var{W3}. The child windows
|
||
of @var{W3} form a vertical combination, consisting of the live
|
||
windows @var{W4} and @var{W5}. Hence, the live windows in this
|
||
window tree are @var{W2}, @var{W4}, and @var{W5}.
|
||
|
||
The following functions can be used to retrieve a child window of an
|
||
internal window, and the siblings of a child window. Their @var{window}
|
||
argument always defaults to the selected window (@pxref{Selecting
|
||
Windows}).
|
||
|
||
@defun window-top-child &optional window
|
||
This function returns the topmost child window of @var{window}, if
|
||
@var{window} is an internal window whose children form a vertical
|
||
combination. For any other type of window, the return value is
|
||
@code{nil}.
|
||
@end defun
|
||
|
||
@defun window-left-child &optional window
|
||
This function returns the leftmost child window of @var{window}, if
|
||
@var{window} is an internal window whose children form a horizontal
|
||
combination. For any other type of window, the return value is
|
||
@code{nil}.
|
||
@end defun
|
||
|
||
@defun window-child window
|
||
This function returns the first child window of the internal window
|
||
@var{window}---the topmost child window for a vertical combination, or
|
||
the leftmost child window for a horizontal combination. If
|
||
@var{window} is a live window, the return value is @code{nil}.
|
||
@end defun
|
||
|
||
@defun window-combined-p &optional window horizontal
|
||
This function returns a non-@code{nil} value if and only if
|
||
@var{window} is part of a vertical combination.
|
||
|
||
If the optional argument @var{horizontal} is non-@code{nil}, this
|
||
means to return non-@code{nil} if and only if @var{window} is part of
|
||
a horizontal combination.
|
||
@end defun
|
||
|
||
@defun window-next-sibling &optional window
|
||
This function returns the next sibling of the specified @var{window}. The
|
||
return value is @code{nil} if @var{window} is the last child of its
|
||
parent.
|
||
@end defun
|
||
|
||
@defun window-prev-sibling &optional window
|
||
This function returns the previous sibling of the specified @var{window}.
|
||
The return value is @code{nil} if @var{window} is the first child of its
|
||
parent.
|
||
@end defun
|
||
|
||
The functions @code{window-next-sibling} and @code{window-prev-sibling}
|
||
should not be confused with the functions @code{next-window} and
|
||
@code{previous-window}, which return the next and previous window in the
|
||
cyclic ordering of windows (@pxref{Cyclic Window Ordering}).
|
||
|
||
The following functions can be useful to locate a window within its
|
||
frame.
|
||
|
||
@defun frame-first-window &optional frame-or-window
|
||
This function returns the live window at the upper left corner of the
|
||
frame specified by @var{frame-or-window}. The argument
|
||
@var{frame-or-window} must denote a window or a live frame and defaults
|
||
to the selected frame. If @var{frame-or-window} specifies a window,
|
||
this function returns the first window on that window's frame. Under
|
||
the assumption that the frame from our canonical example is selected
|
||
@code{(frame-first-window)} returns @var{W2}.
|
||
@end defun
|
||
|
||
@defun window-at-side-p &optional window side
|
||
This function returns @code{t} if @var{window} is located at
|
||
@var{side} of its containing frame. The argument @var{window} must be
|
||
a valid window and defaults to the selected one. The argument
|
||
@var{side} can be any of the symbols @code{left}, @code{top},
|
||
@code{right} or @code{bottom}. The default value @code{nil} is
|
||
handled like @code{bottom}.
|
||
|
||
Note that this function disregards the minibuffer window
|
||
(@pxref{Minibuffer Windows}). Hence, with @var{side} equal to
|
||
@code{bottom} it may return @code{t} also when the minibuffer window
|
||
appears right below @var{window}.
|
||
@end defun
|
||
|
||
@cindex window in direction
|
||
@defun window-in-direction direction &optional window ignore sign wrap minibuf
|
||
This function returns the nearest live window in direction
|
||
@var{direction} as seen from the position of @code{window-point} in
|
||
window @var{window}. The argument @var{direction} must be one of
|
||
@code{above}, @code{below}, @code{left} or @code{right}. The optional
|
||
argument @var{window} must denote a live window and defaults to the
|
||
selected one.
|
||
|
||
This function does not return a window for which
|
||
@code{window-no-other-p} (@pxref{Cyclic Window Ordering}) returns
|
||
non-@code{nil}. If the nearest window's @code{no-other-window}
|
||
parameter is non-@code{nil}, this function tries to find another window
|
||
in the indicated direction whose @code{no-other-window} parameter is
|
||
@code{nil}. However, if the optional argument @var{ignore} is
|
||
non-@code{nil}, a window may be returned even if its
|
||
@code{no-other-window} parameter is non-@code{nil}.
|
||
|
||
If the optional argument @var{sign} is a negative number, it means to
|
||
use the right or bottom edge of @var{window} as reference position
|
||
instead of @code{window-point}. If @var{sign} is a positive number, it
|
||
means to use the left or top edge of @var{window} as reference position.
|
||
|
||
If the optional argument @var{wrap} is non-@code{nil}, this means to
|
||
wrap @var{direction} around frame borders. For example, if @var{window}
|
||
is at the top of the frame and @var{direction} is @code{above}, then
|
||
this function usually returns the frame's minibuffer window if it's
|
||
active and a window at the bottom of the frame otherwise.
|
||
|
||
If the optional argument @var{minibuf} is @code{t}, this function may
|
||
return the minibuffer window even when it's not active. If the
|
||
optional argument @var{minibuf} is @code{nil}, this means to return
|
||
the minibuffer window if and only if it is currently active.
|
||
If @var{minibuf} is neither @code{nil} nor @code{t}, this function
|
||
never returns the minibuffer window. However, if @var{wrap} is
|
||
non-@code{nil}, it always acts as if @var{minibuf} were @code{nil}.
|
||
|
||
If it doesn't find a suitable window, this function returns
|
||
@code{nil}.
|
||
|
||
Don't use this function to check whether there is @emph{no} window in
|
||
@var{direction}. Calling @code{window-at-side-p} described above is a
|
||
much more efficient way to do that.
|
||
@end defun
|
||
|
||
The following function retrieves the entire window tree of a frame:
|
||
|
||
@defun window-tree &optional frame
|
||
This function returns a list representing the window tree for frame
|
||
@var{frame}. If @var{frame} is omitted or @code{nil}, it defaults to
|
||
the selected frame.
|
||
|
||
The return value is a list of the form @code{(@var{root} @var{mini})},
|
||
where @var{root} represents the window tree of the frame's root
|
||
window, and @var{mini} is the frame's minibuffer window.
|
||
|
||
If the root window is live, @var{root} is that window itself.
|
||
Otherwise, @var{root} is a list @code{(@var{dir} @var{edges} @var{w1}
|
||
@var{w2} ...)} where @var{dir} is @code{nil} for a horizontal
|
||
combination and @code{t} for a vertical combination, @var{edges} gives
|
||
the size and position of the combination, and the remaining elements
|
||
are the child windows. Each child window may again be a window object
|
||
(for a live window) or a list with the same format as above (for an
|
||
internal window). The @var{edges} element is a list @code{(@var{left}
|
||
@var{top} @var{right} @var{bottom})}, similar to the value returned by
|
||
@code{window-edges} (@pxref{Coordinates and Windows}).
|
||
@end defun
|
||
|
||
|
||
@node Selecting Windows
|
||
@section Selecting Windows
|
||
@cindex selecting a window
|
||
|
||
@cindex selected window
|
||
@cindex window selected within a frame
|
||
In each frame, at any time, exactly one Emacs window is designated
|
||
as @dfn{selected within the frame}. For the selected frame, that
|
||
window is called the @dfn{selected window}---the one in which most
|
||
editing takes place, and in which the cursor for selected windows
|
||
appears (@pxref{Cursor Parameters}). Keyboard input that inserts or
|
||
deletes text is also normally directed to this window. The selected
|
||
window's buffer is usually also the current buffer, except when
|
||
@code{set-buffer} has been used (@pxref{Current Buffer}). As for
|
||
non-selected frames, the window selected within the frame becomes the
|
||
selected window if the frame is ever selected.
|
||
|
||
@defun selected-window
|
||
This function returns the selected window (which is always a live
|
||
window).
|
||
@end defun
|
||
|
||
The following function explicitly selects a window and its frame.
|
||
|
||
@defun select-window window &optional norecord
|
||
This function makes @var{window} the selected window and the window
|
||
selected within its frame, and selects that frame. It also makes
|
||
@var{window}'s buffer (@pxref{Buffers and Windows}) current and sets
|
||
that buffer's value of @code{point} to the value of @code{window-point}
|
||
(@pxref{Window Point}) in @var{window}. @var{window} must be a live
|
||
window. The return value is @var{window}.
|
||
|
||
By default, this function also moves @var{window}'s buffer to the front
|
||
of the buffer list (@pxref{Buffer List}) and makes @var{window} the most
|
||
recently selected window. If the optional argument @var{norecord} is
|
||
non-@code{nil}, these additional actions are omitted.
|
||
|
||
In addition, this function by default also tells the display engine to
|
||
update the display of @var{window} when its frame gets redisplayed the
|
||
next time. If @var{norecord} is non-@code{nil}, such updates are
|
||
usually not performed. If, however, @var{norecord} equals the special
|
||
symbol @code{mark-for-redisplay}, the additional actions mentioned above
|
||
are omitted but @var{window}'s display will be nevertheless updated.
|
||
|
||
Note that sometimes selecting a window is not enough to show it, or
|
||
make its frame the top-most frame on display: you may also need to
|
||
raise the frame or make sure input focus is directed to that frame.
|
||
@xref{Input Focus}.
|
||
@end defun
|
||
|
||
@cindex select window hooks
|
||
@cindex running a hook when a window gets selected
|
||
For historical reasons, Emacs does not run a separate hook whenever a
|
||
window gets selected. Applications and internal routines often
|
||
temporarily select a window to perform a few actions on it. They do
|
||
that either to simplify coding---because many functions by default
|
||
operate on the selected window when no @var{window} argument is
|
||
specified---or because some functions did not (and still do not) take a
|
||
window as argument and always operate(d) on the selected window instead.
|
||
Running a hook every time a window gets selected for a short time and
|
||
once more when the previously selected window gets restored is not
|
||
useful.
|
||
|
||
However, when its @var{norecord} argument is @code{nil},
|
||
@code{select-window} updates the buffer list and thus indirectly runs
|
||
the normal hook @code{buffer-list-update-hook} (@pxref{Buffer List}).
|
||
Consequently, that hook provides one way to run a function whenever a
|
||
window gets selected more ``permanently''.
|
||
|
||
Since @code{buffer-list-update-hook} is also run by functions that are
|
||
not related to window management, it will usually make sense to save the
|
||
value of the selected window somewhere and compare it with the value of
|
||
@code{selected-window} while running that hook. Also, to avoid false
|
||
positives when using @code{buffer-list-update-hook}, it is good practice
|
||
that every @code{select-window} call supposed to select a window only
|
||
temporarily passes a non-@code{nil} @var{norecord} argument. If
|
||
possible, the macro @code{with-selected-window} (see below) should be
|
||
used in such cases.
|
||
|
||
Emacs also runs the hook @code{window-selection-change-functions}
|
||
whenever the redisplay routine detects that another window has been
|
||
selected since last redisplay. @xref{Window Hooks}, for a detailed
|
||
explanation. @code{window-state-change-functions} (described in the
|
||
same section) is another abnormal hook run after a different window
|
||
has been selected but is triggered by other window changes as well.
|
||
|
||
@cindex most recently selected windows
|
||
The sequence of calls to @code{select-window} with a non-@code{nil}
|
||
@var{norecord} argument determines an ordering of windows by their
|
||
selection or use time, see below. The function @code{get-lru-window},
|
||
for example, can then be used to retrieve the least recently selected
|
||
window (@pxref{Cyclic Window Ordering}).
|
||
|
||
@defun frame-selected-window &optional frame
|
||
This function returns the window on @var{frame} that is selected
|
||
within that frame. @var{frame} should be a live frame; if omitted or
|
||
@code{nil}, it defaults to the selected frame.
|
||
@end defun
|
||
|
||
@defun set-frame-selected-window frame window &optional norecord
|
||
This function makes @var{window} the window selected within the frame
|
||
@var{frame}. @var{frame} should be a live frame; if @code{nil}, it
|
||
defaults to the selected frame. @var{window} must denote a live window.
|
||
|
||
If @var{frame} is the selected frame, this makes @var{window} the
|
||
selected window.
|
||
|
||
If the optional argument @var{norecord} is non-@code{nil}, this function
|
||
does not alter the ordering of the most recently selected windows, nor
|
||
the buffer list.
|
||
@end defun
|
||
|
||
The following macros are useful to temporarily select a window without
|
||
affecting the ordering of recently selected windows or the buffer list.
|
||
|
||
@defmac save-selected-window forms@dots{}
|
||
This macro records the selected frame, as well as the selected window
|
||
of each frame, executes @var{forms} in sequence, then restores the
|
||
earlier selected frame and windows. It also saves and restores the
|
||
current buffer. It returns the value of the last form in @var{forms}.
|
||
|
||
This macro does not save or restore anything about the sizes,
|
||
arrangement or contents of windows; therefore, if @var{forms} change
|
||
them, the change persists. If the previously selected window of some
|
||
frame is no longer live at the time of exit from @var{forms}, that
|
||
frame's selected window is left alone. If the previously selected
|
||
window is no longer live, then whatever window is selected at the end of
|
||
@var{forms} remains selected. The current buffer is restored if and
|
||
only if it is still live when exiting @var{forms}.
|
||
|
||
This macro changes neither the ordering of recently selected windows nor
|
||
the buffer list.
|
||
@end defmac
|
||
|
||
@defmac with-selected-window window forms@dots{}
|
||
This macro selects @var{window}, executes @var{forms} in sequence, then
|
||
restores the previously selected window and current buffer. The
|
||
ordering of recently selected windows and the buffer list remain
|
||
unchanged unless you deliberately change them within @var{forms}; for
|
||
example, by calling @code{select-window} with argument @var{norecord}
|
||
@code{nil}. Hence, this macro is the preferred way to temporarily work
|
||
with @var{window} as the selected window without needlessly running
|
||
@code{buffer-list-update-hook}.
|
||
|
||
Note that this macro temporarily puts the window management code in an
|
||
unstable state. In particular, the most recently used window (see below)
|
||
will not necessarily match the selected one. Hence, functions like
|
||
@code{get-lru-window} and @code{get-mru-window} may return unexpected
|
||
results when called from the body of this macro.
|
||
@end defmac
|
||
|
||
@defmac with-selected-frame frame forms@dots{}
|
||
This macro executes @var{forms} with @var{frame} as the selected
|
||
frame. The value returned is the value of the last form in
|
||
@var{forms}. This macro saves and restores the selected frame, and
|
||
changes the order of neither the recently selected windows nor the
|
||
buffers in the buffer list.
|
||
@end defmac
|
||
|
||
@cindex window use time
|
||
@cindex use time of window
|
||
@cindex window order by time of last use
|
||
@defun window-use-time &optional window
|
||
This function returns the use time of window @var{window}. @var{window}
|
||
must be a live window and defaults to the selected one.
|
||
|
||
The @dfn{use time} of a window is not really a time value, but an
|
||
integer that does increase monotonically with each call of
|
||
@code{select-window} with a @code{nil} @var{norecord} argument. The
|
||
window with the lowest use time is usually called the least recently
|
||
used window. The window with the highest use time is called the most
|
||
recently used one (@pxref{Cyclic Window Ordering}) and is usually the
|
||
selected window unless @code{with-selected-window} has been used.
|
||
@end defun
|
||
|
||
@defun window-bump-use-time &optional window
|
||
This function marks @var{window} as being the second most recently
|
||
used one (after the selected window). It does nothing if @var{window}
|
||
is the selected window or the selected window does not have the
|
||
highest use time among all windows which may happen within the scope
|
||
of @code{with-selected-window}.
|
||
@end defun
|
||
|
||
@anchor{Window Group}Sometimes several windows collectively and
|
||
cooperatively display a buffer, for example, under the management of
|
||
Follow Mode (@pxref{Follow Mode,,, emacs}), where the windows together
|
||
display a bigger portion of the buffer than one window could alone.
|
||
It is often useful to consider such a @dfn{window group} as a single
|
||
entity. Several functions such as @code{window-group-start}
|
||
(@pxref{Window Start and End}) allow you to do this by supplying, as
|
||
an argument, one of the windows as a stand-in for the whole group.
|
||
|
||
@defun selected-window-group
|
||
@vindex selected-window-group-function
|
||
When the selected window is a member of a group of windows, this
|
||
function returns a list of the windows in the group, ordered such that
|
||
the first window in the list is displaying the earliest part of the
|
||
buffer, and so on. Otherwise the function returns a list containing
|
||
just the selected window.
|
||
|
||
The selected window is considered part of a group when the buffer
|
||
local variable @code{selected-window-group-function} is set to a
|
||
function. In this case, @code{selected-window-group} calls it with no
|
||
arguments and returns its result (which should be the list of windows
|
||
in the group).
|
||
@end defun
|
||
|
||
|
||
@node Window Sizes
|
||
@section Window Sizes
|
||
@cindex window size
|
||
@cindex size of window
|
||
|
||
Emacs provides miscellaneous functions for finding the height and width
|
||
of a window. The return value of many of these functions can be
|
||
specified either in units of pixels or in units of lines and columns.
|
||
On a graphical display, the latter actually correspond to the height and
|
||
width of a default character specified by the frame's default font as
|
||
returned by @code{frame-char-height} and @code{frame-char-width}
|
||
(@pxref{Frame Font}). Thus, if a window is displaying text with a
|
||
different font or size, the reported line height and column width for
|
||
that window may differ from the actual number of text lines or columns
|
||
displayed within it.
|
||
|
||
@cindex window height
|
||
@cindex height of a window
|
||
@cindex total height of a window
|
||
The @dfn{total height} of a window is the number of lines comprising
|
||
its body and its top and bottom decorations (@pxref{Basic Windows}).
|
||
|
||
@defun window-total-height &optional window round
|
||
This function returns the total height, in lines, of the window
|
||
@var{window}. If @var{window} is omitted or @code{nil}, it defaults to
|
||
the selected window. If @var{window} is an internal window, the return
|
||
value is the total height occupied by its descendant windows.
|
||
|
||
If a window's pixel height is not an integral multiple of its frame's
|
||
default character height, the number of lines occupied by the window is
|
||
rounded internally. This is done in a way such that, if the window is a
|
||
parent window, the sum of the total heights of all its child windows
|
||
internally equals the total height of their parent. This means that
|
||
although two windows have the same pixel height, their internal total
|
||
heights may differ by one line. This means also, that if window is
|
||
vertically combined and has a next sibling, the topmost row of that
|
||
sibling can be calculated as the sum of this window's topmost row and
|
||
total height (@pxref{Coordinates and Windows})
|
||
|
||
If the optional argument @var{round} is @code{ceiling}, this
|
||
function returns the smallest integer larger than @var{window}'s pixel
|
||
height divided by the character height of its frame; if it is
|
||
@code{floor}, it returns the largest integer smaller than said value;
|
||
with any other @var{round} it returns the internal value of
|
||
@var{windows}'s total height.
|
||
@end defun
|
||
|
||
@cindex window width
|
||
@cindex width of a window
|
||
@cindex total width of a window
|
||
The @dfn{total width} of a window is the number of columns comprising its
|
||
body and its left and right decorations (@pxref{Basic Windows}).
|
||
|
||
@defun window-total-width &optional window round
|
||
This function returns the total width, in columns, of the window
|
||
@var{window}. If @var{window} is omitted or @code{nil}, it defaults to
|
||
the selected window. If @var{window} is internal, the return value is
|
||
the total width occupied by its descendant windows.
|
||
|
||
If a window's pixel width is not an integral multiple of its frame's
|
||
character width, the number of columns occupied by the window is rounded
|
||
internally. This is done in a way such that, if the window is a parent
|
||
window, the sum of the total widths of all its children internally
|
||
equals the total width of their parent. This means that although two
|
||
windows have the same pixel width, their internal total widths may
|
||
differ by one column. This means also, that if this window is
|
||
horizontally combined and has a next sibling, the leftmost column of
|
||
that sibling can be calculated as the sum of this window's leftmost
|
||
column and total width (@pxref{Coordinates and Windows}). The optional
|
||
argument @var{round} behaves as it does for @code{window-total-height}.
|
||
@end defun
|
||
|
||
@defun window-total-size &optional window horizontal round
|
||
This function returns either the total height in lines or the total
|
||
width in columns of the window @var{window}. If @var{horizontal} is
|
||
omitted or @code{nil}, this is equivalent to calling
|
||
@code{window-total-height} for @var{window}; otherwise it is equivalent
|
||
to calling @code{window-total-width} for @var{window}. The optional
|
||
argument @var{round} behaves as it does for @code{window-total-height}.
|
||
@end defun
|
||
|
||
The following two functions can be used to return the total size of a
|
||
window in units of pixels.
|
||
|
||
@cindex window pixel height
|
||
@cindex pixel height of a window
|
||
@cindex total pixel height of a window
|
||
|
||
@defun window-pixel-height &optional window
|
||
This function returns the total height of window @var{window} in pixels.
|
||
@var{window} must be a valid window and defaults to the selected one.
|
||
|
||
The return value includes the heights of @var{window}'s top and bottom
|
||
decorations. If @var{window} is an internal window, its pixel height is
|
||
the pixel height of the screen areas spanned by its children.
|
||
@end defun
|
||
|
||
@cindex window pixel width
|
||
@cindex pixel width of a window
|
||
@cindex total pixel width of a window
|
||
|
||
@defun window-pixel-width &optional window
|
||
This function returns the width of window @var{window} in pixels.
|
||
@var{window} must be a valid window and defaults to the selected one.
|
||
|
||
The return value includes the widths of @var{window}'s left and right
|
||
decorations. If @var{window} is an internal window, its pixel width is
|
||
the width of the screen areas spanned by its children.
|
||
@end defun
|
||
|
||
@cindex full-width window
|
||
@cindex full-height window
|
||
The following functions can be used to determine whether a given
|
||
window has any adjacent windows.
|
||
|
||
@defun window-full-height-p &optional window
|
||
This function returns non-@code{nil} if @var{window} has no other window
|
||
above or below it in its frame. More precisely, this means that the
|
||
total height of @var{window} equals the total height of the root window
|
||
on that frame. The minibuffer window does not count in this regard. If
|
||
@var{window} is omitted or @code{nil}, it defaults to the selected
|
||
window.
|
||
@end defun
|
||
|
||
@defun window-full-width-p &optional window
|
||
This function returns non-@code{nil} if @var{window} has no other
|
||
window to the left or right in its frame, i.e., its total width equals
|
||
that of the root window on that frame. If @var{window} is omitted or
|
||
@code{nil}, it defaults to the selected window.
|
||
@end defun
|
||
|
||
@cindex window body height
|
||
@cindex body height of a window
|
||
The @dfn{body height} of a window is the height of its body, which
|
||
does not include any of its top or bottom decorations (@pxref{Basic
|
||
Windows}).
|
||
|
||
@defun window-body-height &optional window pixelwise
|
||
This function returns the height, in lines, of the body of window
|
||
@var{window}. If @var{window} is omitted or @code{nil}, it defaults to
|
||
the selected window; otherwise it must be a live window.
|
||
|
||
The optional argument @var{pixelwise} defines the units to use for the
|
||
height. If @code{nil}, return the body height of @var{window} in
|
||
characters, rounded down to the nearest integer, if necessary. This
|
||
means that if a line at the bottom of the text area is only partially
|
||
visible, that line is not counted. It also means that the height of a
|
||
window's body can never exceed its total height as returned by
|
||
@code{window-total-height}.
|
||
|
||
If @var{pixelwise} is @code{remap} and the default face is remapped
|
||
(@pxref{Face Remapping}), use the remapped face to determine the
|
||
character height. For any other non-@code{nil} value, return the
|
||
height in pixels.
|
||
@end defun
|
||
|
||
@cindex window body width
|
||
@cindex body width of a window
|
||
The @dfn{body width} of a window is the width of its body and of the
|
||
text area, which does not include any of its left or right decorations
|
||
(@pxref{Basic Windows}).
|
||
|
||
Note that when one or both fringes are removed (by setting their width
|
||
to zero), the display engine reserves two character cells, one on each
|
||
side of the window, for displaying the continuation and truncation
|
||
glyphs, which leaves 2 columns less for text display. (The function
|
||
@code{window-max-chars-per-line}, described below, takes this
|
||
peculiarity into account.)
|
||
|
||
@defun window-body-width &optional window pixelwise
|
||
This function returns the width, in columns, of the body of window
|
||
@var{window}. If @var{window} is omitted or @code{nil}, it defaults to
|
||
the selected window; otherwise it must be a live window.
|
||
|
||
The optional argument @var{pixelwise} defines the units to use for the
|
||
width. If @code{nil}, return the body width of @var{window} in
|
||
characters, rounded down to the nearest integer, if necessary. This
|
||
means that if a column on the right of the text area is only partially
|
||
visible, that column is not counted. It also means that the width of
|
||
a window's body can never exceed its total width as returned by
|
||
@code{window-total-width}.
|
||
|
||
If @var{pixelwise} is @code{remap} and the default face is remapped
|
||
(@pxref{Face Remapping}), use the remapped face to determine the
|
||
character width. For any other non-@code{nil} value, return the width
|
||
in pixels.
|
||
@end defun
|
||
|
||
@cindex window body size
|
||
@cindex body size of a window
|
||
@defun window-body-size &optional window horizontal pixelwise
|
||
This function returns the body height or body width of @var{window}. If
|
||
@var{horizontal} is omitted or @code{nil}, it is equivalent to calling
|
||
@code{window-body-height} for @var{window}; otherwise it is equivalent
|
||
to calling @code{window-body-width}. In either case, the optional
|
||
argument @var{pixelwise} is passed to the function called.
|
||
@end defun
|
||
|
||
The pixel heights of a window's mode, tab and header line can be
|
||
retrieved with the functions given below. Their return value is usually
|
||
accurate unless the window has not been displayed before: In that case,
|
||
the return value is based on an estimate of the font used for the
|
||
window's frame.
|
||
|
||
@defun window-mode-line-height &optional window
|
||
This function returns the height in pixels of @var{window}'s mode line.
|
||
@var{window} must be a live window and defaults to the selected one. If
|
||
@var{window} has no mode line, the return value is zero.
|
||
@end defun
|
||
|
||
@defun window-tab-line-height &optional window
|
||
This function returns the height in pixels of @var{window}'s tab line.
|
||
@var{window} must be a live window and defaults to the selected one. If
|
||
@var{window} has no tab line, the return value is zero.
|
||
@end defun
|
||
|
||
@defun window-header-line-height &optional window
|
||
This function returns the height in pixels of @var{window}'s header
|
||
line. @var{window} must be a live window and defaults to the selected
|
||
one. If @var{window} has no header line, the return value is zero.
|
||
@end defun
|
||
|
||
Functions for retrieving the height and/or width of window dividers
|
||
(@pxref{Window Dividers}), fringes (@pxref{Fringes}), scroll bars
|
||
(@pxref{Scroll Bars}), and display margins (@pxref{Display Margins}) are
|
||
described in the corresponding sections.
|
||
|
||
If your Lisp program needs to make layout decisions, you will find the
|
||
following function useful:
|
||
|
||
@defun window-max-chars-per-line &optional window face
|
||
This function returns the number of characters displayed in the
|
||
specified face @var{face} in the specified window @var{window} (which
|
||
must be a live window). If @var{face} was remapped (@pxref{Face
|
||
Remapping}), the information is returned for the remapped face. If
|
||
omitted or @code{nil}, @var{face} defaults to the default face, and
|
||
@var{window} defaults to the selected window.
|
||
|
||
Unlike @code{window-body-width}, this function accounts for the actual
|
||
size of @var{face}'s font, instead of working in units of the canonical
|
||
character width of @var{window}'s frame (@pxref{Frame Font}). It also
|
||
accounts for space used by the continuation glyph, if @var{window} lacks
|
||
one or both of its fringes.
|
||
@end defun
|
||
|
||
@cindex fixed-size window
|
||
@vindex window-min-height
|
||
@vindex window-min-width
|
||
Commands that change the size of windows (@pxref{Resizing Windows}),
|
||
or split them (@pxref{Splitting Windows}), obey the variables
|
||
@code{window-min-height} and @code{window-min-width}, which specify the
|
||
smallest allowable window height and width. They also obey the variable
|
||
@code{window-size-fixed}, with which a window can be @dfn{fixed} in
|
||
size (@pxref{Preserving Window Sizes}).
|
||
|
||
@defopt window-min-height
|
||
This option specifies the minimum total height, in lines, of any window.
|
||
Its value has to accommodate at least one text line and any top or
|
||
bottom decorations.
|
||
@end defopt
|
||
|
||
@defopt window-min-width
|
||
This option specifies the minimum total width, in columns, of any
|
||
window. Its value has to accommodate at least two text columns and any
|
||
left or right decorations.
|
||
@end defopt
|
||
|
||
The following function tells how small a specific window can get taking
|
||
into account the sizes of its areas and the values of
|
||
@code{window-min-height}, @code{window-min-width} and
|
||
@code{window-size-fixed} (@pxref{Preserving Window Sizes}).
|
||
|
||
@defun window-min-size &optional window horizontal ignore pixelwise
|
||
This function returns the minimum size of @var{window}. @var{window}
|
||
must be a valid window and defaults to the selected one. The optional
|
||
argument @var{horizontal} non-@code{nil} means to return the minimum
|
||
number of columns of @var{window}; otherwise return the minimum number
|
||
of @var{window}'s lines.
|
||
|
||
The return value makes sure that all components of @var{window} remain
|
||
fully visible if @var{window}'s size were actually set to it. With
|
||
@var{horizontal} @code{nil} it includes any top or bottom decorations.
|
||
With @var{horizontal} non-@code{nil} it includes any left or right
|
||
decorations of @var{window}.
|
||
|
||
The optional argument @var{ignore}, if non-@code{nil}, means ignore
|
||
restrictions imposed by fixed size windows, @code{window-min-height} or
|
||
@code{window-min-width} settings. If @var{ignore} equals @code{safe},
|
||
live windows may get as small as @code{window-safe-min-height} lines and
|
||
@code{window-safe-min-width} columns. If @var{ignore} is a window,
|
||
ignore restrictions for that window only. Any other non-@code{nil}
|
||
value means ignore all of the above restrictions for all windows.
|
||
|
||
The optional argument @var{pixelwise} non-@code{nil} means to return the
|
||
minimum size of @var{window} counted in pixels.
|
||
@end defun
|
||
|
||
|
||
@node Resizing Windows
|
||
@section Resizing Windows
|
||
@cindex window resizing
|
||
@cindex resize window
|
||
@cindex changing window size
|
||
@cindex window size, changing
|
||
|
||
This section describes functions for resizing a window without changing
|
||
the size of its frame. Because live windows do not overlap, these
|
||
functions are meaningful only on frames that contain two or more
|
||
windows: resizing a window also changes the size of at least one other
|
||
window. If there is just one window on a frame, its size cannot be
|
||
changed except by resizing the frame (@pxref{Frame Size}).
|
||
|
||
Except where noted, these functions also accept internal windows as
|
||
arguments. Resizing an internal window causes its child windows to be
|
||
resized to fit the same space.
|
||
|
||
@defun window-resizable window delta &optional horizontal ignore pixelwise
|
||
This function returns @var{delta} if the size of @var{window} can be
|
||
changed vertically by @var{delta} lines. If the optional argument
|
||
@var{horizontal} is non-@code{nil}, it instead returns @var{delta} if
|
||
@var{window} can be resized horizontally by @var{delta} columns. It
|
||
does not actually change the window size.
|
||
|
||
If @var{window} is @code{nil}, it defaults to the selected window.
|
||
|
||
A positive value of @var{delta} means to check whether the window can be
|
||
enlarged by that number of lines or columns; a negative value of
|
||
@var{delta} means to check whether the window can be shrunk by that many
|
||
lines or columns. If @var{delta} is non-zero, a return value of 0 means
|
||
that the window cannot be resized.
|
||
|
||
Normally, the variables @code{window-min-height} and
|
||
@code{window-min-width} specify the smallest allowable window size
|
||
(@pxref{Window Sizes}). However, if the optional argument @var{ignore}
|
||
is non-@code{nil}, this function ignores @code{window-min-height} and
|
||
@code{window-min-width}, as well as @code{window-size-fixed}. Instead,
|
||
it considers the minimum height of a window as the sum of its top and
|
||
bottom decorations plus the text of one line; and its minimum width
|
||
as the sum of its left and right decorations plus text that takes two
|
||
columns.
|
||
|
||
If the optional argument @var{pixelwise} is non-@code{nil},
|
||
@var{delta} is interpreted as pixels.
|
||
@end defun
|
||
|
||
@defun window-resize window delta &optional horizontal ignore pixelwise
|
||
This function resizes @var{window} by @var{delta} increments. If
|
||
@var{horizontal} is @code{nil}, it changes the height by @var{delta}
|
||
lines; otherwise, it changes the width by @var{delta} columns. A
|
||
positive @var{delta} means to enlarge the window, and a negative
|
||
@var{delta} means to shrink it.
|
||
|
||
If @var{window} is @code{nil}, it defaults to the selected window. If
|
||
the window cannot be resized as demanded, an error is signaled.
|
||
|
||
The optional argument @var{ignore} has the same meaning as for the
|
||
function @code{window-resizable} above.
|
||
|
||
If the optional argument @var{pixelwise} is non-@code{nil},
|
||
@var{delta} will be interpreted as pixels.
|
||
|
||
The choice of which window edges this function alters depends on the
|
||
values of the option @code{window-combination-resize} and the
|
||
combination limits of the involved windows; in some cases, it may alter
|
||
both edges. @xref{Recombining Windows}. To resize by moving only the
|
||
bottom or right edge of a window, use the function
|
||
@code{adjust-window-trailing-edge}.
|
||
@end defun
|
||
|
||
@c The commands enlarge-window, enlarge-window-horizontally,
|
||
@c shrink-window, and shrink-window-horizontally are documented in the
|
||
@c Emacs manual. They are not preferred for calling from Lisp.
|
||
|
||
@defun adjust-window-trailing-edge window delta &optional horizontal pixelwise
|
||
This function moves @var{window}'s bottom edge by @var{delta} lines.
|
||
If optional argument @var{horizontal} is non-@code{nil}, it instead
|
||
moves the right edge by @var{delta} columns. If @var{window} is
|
||
@code{nil}, it defaults to the selected window.
|
||
|
||
If the optional argument @var{pixelwise} is non-@code{nil},
|
||
@var{delta} is interpreted as pixels.
|
||
|
||
A positive @var{delta} moves the edge downwards or to the right; a
|
||
negative @var{delta} moves it upwards or to the left. If the edge
|
||
cannot be moved as far as specified by @var{delta}, this function
|
||
moves it as far as possible but does not signal an error.
|
||
|
||
This function tries to resize windows adjacent to the edge that is
|
||
moved. If this is not possible for some reason (e.g., if that adjacent
|
||
window is fixed-size), it may resize other windows.
|
||
@end defun
|
||
|
||
@cindex pixelwise, resizing windows
|
||
@defopt window-resize-pixelwise
|
||
If the value of this option is non-@code{nil}, Emacs resizes windows in
|
||
units of pixels. This currently affects functions like
|
||
@code{split-window} (@pxref{Splitting Windows}), @code{maximize-window},
|
||
@code{minimize-window}, @code{fit-window-to-buffer},
|
||
@code{fit-frame-to-buffer} and
|
||
@code{shrink-window-if-larger-than-buffer} (all listed below).
|
||
|
||
Note that when a frame's pixel size is not a multiple of its character
|
||
size, at least one window may get resized pixelwise even if this
|
||
option is @code{nil}. The default value is @code{nil}.
|
||
@end defopt
|
||
|
||
The following commands resize windows in more specific ways. When
|
||
called interactively, they act on the selected window.
|
||
|
||
@deffn Command fit-window-to-buffer &optional window max-height min-height max-width min-width preserve-size
|
||
This command adjusts the height or width of @var{window} to fit the text
|
||
in it. It returns non-@code{nil} if it was able to resize @var{window},
|
||
and @code{nil} otherwise. If @var{window} is omitted or @code{nil}, it
|
||
defaults to the selected window. Otherwise, it should be a live window.
|
||
|
||
If @var{window} is part of a vertical combination, this function adjusts
|
||
@var{window}'s height. The new height is calculated from the actual
|
||
height of the accessible portion of its buffer. The optional argument
|
||
@var{max-height}, if non-@code{nil}, specifies the maximum total height
|
||
that this function can give @var{window}. The optional argument
|
||
@var{min-height}, if non-@code{nil}, specifies the minimum total height
|
||
that it can give, which overrides the variable @code{window-min-height}.
|
||
Both @var{max-height} and @var{min-height} are specified in lines and
|
||
include any top or bottom decorations of @var{window}.
|
||
|
||
If @var{window} is part of a horizontal combination and the value of the
|
||
option @code{fit-window-to-buffer-horizontally} (see below) is
|
||
non-@code{nil}, this function adjusts @var{window}'s width. The new
|
||
width of @var{window} is calculated from the maximum length of its
|
||
buffer's lines that follow the current start position of @var{window}.
|
||
The optional argument @var{max-width} specifies a maximum width and
|
||
defaults to the width of @var{window}'s frame. The optional argument
|
||
@var{min-width} specifies a minimum width and defaults to
|
||
@code{window-min-width}. Both @var{max-width} and @var{min-width} are
|
||
specified in columns and include any left or right decorations of
|
||
@var{window}.
|
||
|
||
The optional argument @var{preserve-size}, if non-@code{nil}, will
|
||
install a parameter to preserve the size of @var{window} during future
|
||
resize operations (@pxref{Preserving Window Sizes}).
|
||
|
||
If the option @code{fit-frame-to-buffer} (see below) is non-@code{nil},
|
||
this function will try to resize the frame of @var{window} to fit its
|
||
contents by calling @code{fit-frame-to-buffer} (see below).
|
||
@end deffn
|
||
|
||
@defopt fit-window-to-buffer-horizontally
|
||
If this is non-@code{nil}, @code{fit-window-to-buffer} can resize
|
||
windows horizontally. If this is @code{nil} (the default)
|
||
@code{fit-window-to-buffer} never resizes windows horizontally. If this
|
||
is @code{only}, it can resize windows horizontally only. Any other
|
||
value means @code{fit-window-to-buffer} can resize windows in both
|
||
dimensions.
|
||
@end defopt
|
||
|
||
@defopt fit-frame-to-buffer
|
||
If this option is non-@code{nil}, @code{fit-window-to-buffer} can fit a
|
||
frame to its buffer. A frame is fit if and only if its root window is a
|
||
live window and this option is non-@code{nil}. If this is
|
||
@code{horizontally}, frames are fit horizontally only. If this is
|
||
@code{vertically}, frames are fit vertically only. Any other
|
||
non-@code{nil} value means frames can be resized in both dimensions.
|
||
@end defopt
|
||
|
||
If you have a frame that displays only one window, you can fit that
|
||
frame to its buffer using the command @code{fit-frame-to-buffer}.
|
||
|
||
@deffn Command fit-frame-to-buffer &optional frame max-height min-height max-width min-width only
|
||
This command adjusts the size of @var{frame} to display the contents of
|
||
its buffer exactly. @var{frame} can be any live frame and defaults to
|
||
the selected one. Fitting is done only if @var{frame}'s root window is
|
||
live.
|
||
|
||
The arguments @var{max-height}, @var{min-height}, @var{max-width} and
|
||
@var{min-width}, if non-@code{nil}, specify bounds on the new body size
|
||
of @var{frame}'s root window. A non-@code{nil} value specified by any
|
||
of these arguments overrides the corresponding value specified by
|
||
the option @code{fit-frame-to-buffer-sizes} described below.
|
||
|
||
If the optional argument @var{only} is @code{vertically}, this function
|
||
may resize the frame vertically only. If @var{only} is
|
||
@code{horizontally}, it may resize the frame horizontally only.
|
||
@end deffn
|
||
|
||
The behavior of @code{fit-frame-to-buffer} can be controlled with the
|
||
help of the two options listed next.
|
||
|
||
@defopt fit-frame-to-buffer-margins
|
||
This option can be used to specify margins around frames to be fit by
|
||
@code{fit-frame-to-buffer}. Such margins can be useful to avoid, for
|
||
example, that the resized frame overlaps the taskbar or parts of its
|
||
parent frame.
|
||
|
||
It specifies the numbers of pixels to be left free on the left, above,
|
||
the right, and below a frame that shall be fit. The default specifies
|
||
@code{nil} for each which means to use no margins. The value specified
|
||
here can be overridden for a specific frame by that frame's
|
||
@code{fit-frame-to-buffer-margins} parameter, if present.
|
||
@end defopt
|
||
|
||
@defopt fit-frame-to-buffer-sizes
|
||
This option specifies size boundaries for @code{fit-frame-to-buffer}.
|
||
It specifies the maximum and minimum lines and maximum and minimum
|
||
columns of the root window's body of any frame that shall be fit to its
|
||
buffer. Any value this option specifies will be overridden by the
|
||
corresponding argument of @code{fit-frame-to-buffer}, if non-@code{nil}.
|
||
@end defopt
|
||
|
||
@deffn Command shrink-window-if-larger-than-buffer &optional window
|
||
This command attempts to reduce @var{window}'s height as much as
|
||
possible while still showing its full buffer, but no less than
|
||
@code{window-min-height} lines. The return value is non-@code{nil} if
|
||
the window was resized, and @code{nil} otherwise. If @var{window} is
|
||
omitted or @code{nil}, it defaults to the selected window. Otherwise,
|
||
it should be a live window.
|
||
|
||
This command does nothing if the window is already too short to
|
||
display all of its buffer, or if any of the buffer is scrolled
|
||
off-screen, or if the window is the only live window in its frame.
|
||
|
||
This command calls @code{fit-window-to-buffer} (see above) to do its
|
||
work.
|
||
@end deffn
|
||
|
||
|
||
@cindex balancing window sizes
|
||
@deffn Command balance-windows &optional window-or-frame
|
||
This function balances windows in a way that gives more space to
|
||
full-width and/or full-height windows. If @var{window-or-frame}
|
||
specifies a frame, it balances all windows on that frame. If
|
||
@var{window-or-frame} specifies a window, it balances only that window
|
||
and its siblings (@pxref{Windows and Frames}).
|
||
@end deffn
|
||
|
||
@deffn Command balance-windows-area
|
||
This function attempts to give all windows on the selected frame
|
||
approximately the same share of the screen area. Full-width or
|
||
full-height windows are not given more space than other windows.
|
||
@end deffn
|
||
|
||
@cindex maximizing windows
|
||
@deffn Command maximize-window &optional window
|
||
This function attempts to make @var{window} as large as possible, in
|
||
both dimensions, without resizing its frame or deleting other windows.
|
||
If @var{window} is omitted or @code{nil}, it defaults to the selected
|
||
window.
|
||
@end deffn
|
||
|
||
@cindex minimizing windows
|
||
@deffn Command minimize-window &optional window
|
||
This function attempts to make @var{window} as small as possible, in
|
||
both dimensions, without deleting it or resizing its frame. If
|
||
@var{window} is omitted or @code{nil}, it defaults to the selected
|
||
window.
|
||
@end deffn
|
||
|
||
|
||
@node Preserving Window Sizes
|
||
@section Preserving Window Sizes
|
||
@cindex preserving window sizes
|
||
|
||
A window can get resized explicitly by using one of the functions from
|
||
the preceding section or implicitly, for example, when resizing an
|
||
adjacent window, when splitting or deleting a window (@pxref{Splitting
|
||
Windows}, @pxref{Deleting Windows}) or when resizing the window's frame
|
||
(@pxref{Frame Size}).
|
||
|
||
It is possible to avoid implicit resizing of a specific window when
|
||
there are one or more other resizable windows on the same frame. For
|
||
this purpose, Emacs must be advised to @dfn{preserve} the size of that
|
||
window. There are two basic ways to do that.
|
||
|
||
@defvar window-size-fixed
|
||
If this buffer-local variable is non-@code{nil}, the size of any window
|
||
displaying the buffer cannot normally be changed. Deleting a window or
|
||
changing the frame's size may still change the window's size, if there
|
||
is no choice.
|
||
|
||
If the value is @code{height}, then only the window's height is fixed;
|
||
if the value is @code{width}, then only the window's width is fixed.
|
||
Any other non-@code{nil} value fixes both the width and the height.
|
||
|
||
If this variable is @code{nil}, this does not necessarily mean that any
|
||
window showing the buffer can be resized in the desired direction. To
|
||
determine that, use the function @code{window-resizable}.
|
||
@xref{Resizing Windows}.
|
||
@end defvar
|
||
|
||
Often @code{window-size-fixed} is overly aggressive because it inhibits
|
||
any attempt to explicitly resize or split an affected window as well.
|
||
This may even happen after the window has been resized implicitly, for
|
||
example, when deleting an adjacent window or resizing the window's
|
||
frame. The following function tries hard to never disallow resizing
|
||
such a window explicitly:
|
||
|
||
@defun window-preserve-size &optional window horizontal preserve
|
||
This function (un-)marks the height of window @var{window} as preserved
|
||
for future resize operations. @var{window} must be a live window and
|
||
defaults to the selected one. If the optional argument @var{horizontal}
|
||
is non-@code{nil}, it (un-)marks the width of @var{window} as preserved.
|
||
|
||
If the optional argument @var{preserve} is @code{t}, this means to
|
||
preserve the current height/width of @var{window}'s body. The
|
||
height/width of @var{window} will change only if Emacs has no better
|
||
choice. Resizing a window whose height/width is preserved by this
|
||
function never throws an error.
|
||
|
||
If @var{preserve} is @code{nil}, this means to stop preserving the
|
||
height/width of @var{window}, lifting any respective restraint induced
|
||
by a previous call of this function for @var{window}. Calling
|
||
@code{enlarge-window}, @code{shrink-window} or
|
||
@code{fit-window-to-buffer} with @var{window} as argument may also
|
||
remove the respective restraint.
|
||
@end defun
|
||
|
||
@code{window-preserve-size} is currently invoked by the following
|
||
functions:
|
||
|
||
@table @code
|
||
@item fit-window-to-buffer
|
||
If the optional argument @var{preserve-size} of that function
|
||
(@pxref{Resizing Windows}) is non-@code{nil}, the size established by
|
||
that function is preserved.
|
||
|
||
@item display-buffer
|
||
If the @var{alist} argument of that function (@pxref{Choosing Window})
|
||
contains a @code{preserve-size} entry, the size of the window produced
|
||
by that function is preserved.
|
||
@end table
|
||
|
||
@code{window-preserve-size} installs a window parameter (@pxref{Window
|
||
Parameters}) called @code{window-preserved-size} which is consulted by the
|
||
window resizing functions. This parameter will not prevent resizing the
|
||
window when the window shows another buffer than the one when
|
||
@code{window-preserve-size} was invoked or if its size has changed since
|
||
then.
|
||
|
||
The following function can be used to check whether the height of a
|
||
particular window is preserved:
|
||
|
||
@defun window-preserved-size &optional window horizontal
|
||
This function returns the preserved height of window @var{window} in
|
||
pixels. @var{window} must be a live window and defaults to the selected
|
||
one. If the optional argument @var{horizontal} is non-@code{nil}, it
|
||
returns the preserved width of @var{window}. It returns @code{nil} if
|
||
the size of @var{window} is not preserved.
|
||
@end defun
|
||
|
||
|
||
@node Splitting Windows
|
||
@section Splitting Windows
|
||
@cindex splitting windows
|
||
@cindex window splitting
|
||
|
||
This section describes functions for creating a new window by
|
||
@dfn{splitting} an existing one. Note that some windows are special in
|
||
the sense that these functions may fail to split them as described here.
|
||
Examples of such windows are side windows (@pxref{Side Windows}) and
|
||
atomic windows (@pxref{Atomic Windows}).
|
||
|
||
@defun split-window &optional window size side pixelwise
|
||
This function creates a new live window next to the window
|
||
@var{window}. If @var{window} is omitted or @code{nil}, it defaults
|
||
to the selected window. That window is split, and reduced in
|
||
size. The space is taken up by the new window, which is returned.
|
||
|
||
The optional second argument @var{size} determines the sizes of
|
||
@var{window} and/or the new window. If it is omitted or @code{nil},
|
||
both windows are given equal sizes; if there is an odd line, it is
|
||
allocated to the new window. If @var{size} is a positive number,
|
||
@var{window} is given @var{size} lines (or columns, depending on the
|
||
value of @var{side}). If @var{size} is a negative number, the new
|
||
window is given @minus{}@var{size} lines (or columns).
|
||
|
||
If @var{size} is @code{nil}, this function obeys the variables
|
||
@code{window-min-height} and @code{window-min-width} (@pxref{Window
|
||
Sizes}). Thus, it signals an error if splitting would result in making
|
||
a window smaller than those variables specify. However, a
|
||
non-@code{nil} value for @var{size} causes those variables to be
|
||
ignored; in that case, the smallest allowable window is considered to be
|
||
one that has space for a text that is one line tall and/or two columns
|
||
wide.
|
||
|
||
Hence, if @var{size} is specified, it's the caller's responsibility to
|
||
check whether the emanating windows are large enough to encompass all of
|
||
their decorations like a mode line or a scroll bar. The function
|
||
@code{window-min-size} (@pxref{Window Sizes}) can be used to determine
|
||
the minimum requirements of @var{window} in this regard. Since the new
|
||
window usually inherits areas like the mode line or the scroll bar from
|
||
@var{window}, that function is also a good guess for the minimum size of
|
||
the new window. The caller should specify a smaller size only if it
|
||
correspondingly removes an inherited area before the next redisplay.
|
||
|
||
The optional third argument @var{side} determines the position of the
|
||
new window relative to @var{window}. If it is @code{nil} or
|
||
@code{below}, the new window is placed below @var{window}. If it is
|
||
@code{above}, the new window is placed above @var{window}. In both
|
||
these cases, @var{size} specifies a total window height, in lines.
|
||
|
||
If @var{side} is @code{t} or @code{right}, the new window is placed on
|
||
the right of @var{window}. If @var{side} is @code{left}, the new
|
||
window is placed on the left of @var{window}. In both these cases,
|
||
@var{size} specifies a total window width, in columns.
|
||
|
||
The optional fourth argument @var{pixelwise}, if non-@code{nil}, means
|
||
to interpret @var{size} in units of pixels, instead of lines and
|
||
columns.
|
||
|
||
If @var{window} is a live window, the new window inherits various
|
||
properties from it, including margins and scroll bars. If
|
||
@var{window} is an internal window, the new window inherits the
|
||
properties of the window selected within @var{window}'s frame.
|
||
|
||
The behavior of this function may be altered by the window parameters
|
||
of @var{window}, so long as the variable
|
||
@code{ignore-window-parameters} is @code{nil}. If the value of
|
||
the @code{split-window} window parameter is @code{t}, this function
|
||
ignores all other window parameters. Otherwise, if the value of the
|
||
@code{split-window} window parameter is a function, that function is
|
||
called with the arguments @var{window}, @var{size}, and @var{side}, in
|
||
lieu of the usual action of @code{split-window}. Otherwise, this
|
||
function obeys the @code{window-atom} or @code{window-side} window
|
||
parameter, if any. @xref{Window Parameters}.
|
||
@end defun
|
||
|
||
As an example, here is a sequence of @code{split-window} calls that
|
||
yields the window configuration discussed in @ref{Windows and Frames}.
|
||
This example demonstrates splitting a live window as well as splitting
|
||
an internal window. We begin with a frame containing a single window
|
||
(a live root window), which we denote by @var{W4}. Calling
|
||
@code{(split-window W4)} yields this window configuration:
|
||
|
||
@smallexample
|
||
@group
|
||
______________________________________
|
||
| ____________________________________ |
|
||
|| ||
|
||
|| ||
|
||
|| ||
|
||
||_________________W4_________________||
|
||
| ____________________________________ |
|
||
|| ||
|
||
|| ||
|
||
|| ||
|
||
||_________________W5_________________||
|
||
|__________________W3__________________|
|
||
|
||
@end group
|
||
@end smallexample
|
||
|
||
@noindent
|
||
The @code{split-window} call has created a new live window, denoted by
|
||
@var{W5}. It has also created a new internal window, denoted by
|
||
@var{W3}, which becomes the root window and the parent of both
|
||
@var{W4} and @var{W5}.
|
||
|
||
Next, we call @code{(split-window W3 nil 'left)}, passing the
|
||
internal window @var{W3} as the argument. The result:
|
||
|
||
@smallexample
|
||
@group
|
||
______________________________________
|
||
| ______ ____________________________ |
|
||
|| || __________________________ ||
|
||
|| ||| |||
|
||
|| ||| |||
|
||
|| ||| |||
|
||
|| |||____________W4____________|||
|
||
|| || __________________________ ||
|
||
|| ||| |||
|
||
|| ||| |||
|
||
|| |||____________W5____________|||
|
||
||__W2__||_____________W3_____________ |
|
||
|__________________W1__________________|
|
||
@end group
|
||
@end smallexample
|
||
|
||
@noindent
|
||
A new live window @var{W2} is created, to the left of the internal
|
||
window @var{W3}. A new internal window @var{W1} is created, becoming
|
||
the new root window.
|
||
|
||
For interactive use, Emacs provides two commands which always split
|
||
the selected window. These call @code{split-window} internally.
|
||
|
||
@deffn Command split-window-right &optional size window-to-split
|
||
This function splits the window @var{window-to-split} into two
|
||
side-by-side windows, putting @var{window-to-split} on the left.
|
||
@var{window-to-split} defaults to the selected window. If @var{size}
|
||
is positive, the left window gets @var{size} columns; if @var{size} is
|
||
negative, the right window gets @minus{}@var{size} columns.
|
||
@end deffn
|
||
|
||
@deffn Command split-window-below &optional size window-to-split
|
||
This function splits the window @var{window-to-split} into two
|
||
windows, one above the other, leaving the upper window selected.
|
||
@var{window-to-split} defaults to the selected window. If @var{size}
|
||
is positive, the upper window gets @var{size} lines; if @var{size} is
|
||
negative, the lower window gets @minus{}@var{size} lines.
|
||
@end deffn
|
||
|
||
@deffn Command split-root-window-below &optional size
|
||
This function splits the whole frame in two. The current window
|
||
configuration is retained on the top, and a new window is created
|
||
below, taking up the whole width of the frame. @var{size} is treated
|
||
as by @code{split-window-below}.
|
||
@end deffn
|
||
|
||
@deffn Command split-root-window-right &optional size
|
||
This function splits the whole frame in two. The current window
|
||
configuration is retained on the left, and a new window is created on
|
||
the right, taking up the whole height of the frame. @var{size} is treated
|
||
as by @code{split-window-right}.
|
||
@end deffn
|
||
|
||
@defopt split-window-keep-point
|
||
If the value of this variable is non-@code{nil} (the default),
|
||
@code{split-window-below} behaves as described above.
|
||
|
||
If it is @code{nil}, @code{split-window-below} adjusts point in each
|
||
of the two windows to minimize redisplay. (This is useful on slow
|
||
terminals.) It selects whichever window contains the screen line that
|
||
point was previously on. Note that this only affects
|
||
@code{split-window-below}, not the lower-level @code{split-window}
|
||
function.
|
||
@end defopt
|
||
|
||
|
||
@node Deleting Windows
|
||
@section Deleting Windows
|
||
@cindex deleting windows
|
||
|
||
@dfn{Deleting} a window removes it from the frame's window tree. If
|
||
the window is a live window, it disappears from the screen. If the
|
||
window is an internal window, its child windows are deleted too.
|
||
|
||
Even after a window is deleted, it continues to exist as a Lisp
|
||
object, until there are no more references to it. Window deletion can
|
||
be reversed, by restoring a saved window configuration (@pxref{Window
|
||
Configurations}).
|
||
|
||
@deffn Command delete-window &optional window
|
||
This function removes @var{window} from display and returns
|
||
@code{nil}. If @var{window} is omitted or @code{nil}, it defaults to
|
||
the selected window.
|
||
|
||
If deleting the window would leave no more windows in the window tree
|
||
(e.g., if it is the only live window in the frame) or all remaining
|
||
windows on @var{window}'s frame are side windows (@pxref{Side
|
||
Windows}), an error is signaled. If @var{window} is part of an atomic
|
||
window (@pxref{Atomic Windows}), this function tries to delete the
|
||
root of that atomic window instead.
|
||
|
||
By default, the space taken up by @var{window} is given to one of its
|
||
adjacent sibling windows, if any. However, if the variable
|
||
@code{window-combination-resize} is non-@code{nil}, the space is
|
||
proportionally distributed among any remaining windows in the same
|
||
window combination. @xref{Recombining Windows}.
|
||
|
||
The behavior of this function may be altered by the window parameters of
|
||
@var{window}, so long as the variable @code{ignore-window-parameters} is
|
||
@code{nil}. If the value of the @code{delete-window} window parameter
|
||
is @code{t}, this function ignores all other window parameters.
|
||
Otherwise, if the value of the @code{delete-window} window parameter is
|
||
a function, that function is called with the argument @var{window}, in
|
||
lieu of the usual action of @code{delete-window}. @xref{Window
|
||
Parameters}.
|
||
@end deffn
|
||
|
||
When @code{delete-window} deletes the selected window of its frame, it
|
||
has to make another window the new selected window of that frame. The
|
||
following option allows configuring which window is chosen.
|
||
|
||
@defopt delete-window-choose-selected
|
||
This option allows specifying which window should become a frame's
|
||
selected window after @code{delete-window} has deleted the previously
|
||
selected one. Possible choices are
|
||
|
||
@itemize
|
||
@item @code{mru}
|
||
(the default) choose the most recently used window on that frame.
|
||
|
||
@item @code{pos}
|
||
choose the window comprising the frame coordinates of point of the
|
||
previously selected window on that frame.
|
||
|
||
@item @code{nil}
|
||
choose the first window (the window returned by
|
||
@code{frame-first-window}) on that frame.
|
||
@end itemize
|
||
|
||
A window for which @code{window-no-other-p} (@pxref{Cyclic Window
|
||
Ordering}) returns non-@code{nil} is chosen only if all other windows on
|
||
that frame have their @code{no-other-window} parameter set to a
|
||
non-@code{nil} value too.
|
||
@end defopt
|
||
|
||
@deffn Command delete-other-windows &optional window
|
||
This function makes @var{window} fill its frame, deleting other
|
||
windows as necessary. If @var{window} is omitted or @code{nil}, it
|
||
defaults to the selected window. An error is signaled if @var{window}
|
||
is a side window (@pxref{Side Windows}). If @var{window} is part of
|
||
an atomic window (@pxref{Atomic Windows}), this function tries to make
|
||
the root of that atomic window fill its frame. The return
|
||
value is @code{nil}.
|
||
|
||
The behavior of this function may be altered by the window parameters of
|
||
@var{window}, so long as the variable @code{ignore-window-parameters} is
|
||
@code{nil}. If the value of the @code{delete-other-windows} window
|
||
parameter is @code{t}, this function ignores all other window
|
||
parameters. Otherwise, if the value of the @code{delete-other-windows}
|
||
window parameter is a function, that function is called with the
|
||
argument @var{window}, in lieu of the usual action of
|
||
@code{delete-other-windows}. @xref{Window Parameters}.
|
||
|
||
Also, if @code{ignore-window-parameters} is @code{nil}, this function
|
||
does not delete any window whose @code{no-delete-other-windows}
|
||
parameter is non-@code{nil}.
|
||
@end deffn
|
||
|
||
@deffn Command delete-windows-on &optional buffer-or-name frame
|
||
This function deletes all windows showing @var{buffer-or-name}, by
|
||
calling @code{delete-window} on those windows. @var{buffer-or-name}
|
||
should be a buffer, or the name of a buffer; if omitted or @code{nil},
|
||
it defaults to the current buffer. If there are no windows showing
|
||
the specified buffer, this function does nothing. If the specified
|
||
buffer is a minibuffer, an error is signaled.
|
||
|
||
If there is a dedicated window showing the buffer, and that window is
|
||
the only one on its frame, this function also deletes that frame if it
|
||
is not the only frame on the terminal.
|
||
|
||
The optional argument @var{frame} specifies which frames to operate
|
||
on:
|
||
|
||
@itemize @bullet
|
||
@item @code{nil}
|
||
means operate on all frames.
|
||
@item @code{t}
|
||
means operate on the selected frame.
|
||
@item @code{visible}
|
||
means operate on all visible frames.
|
||
@item @code{0}
|
||
means operate on all visible or iconified frames.
|
||
@item A frame
|
||
means operate on that frame.
|
||
@end itemize
|
||
|
||
Note that this argument does not have the same meaning as in other
|
||
functions which scan all live windows (@pxref{Cyclic Window
|
||
Ordering}). Specifically, the meanings of @code{t} and @code{nil} here
|
||
are the opposite of what they are in those other functions.
|
||
@end deffn
|
||
|
||
@cindex implicit deletion of windows
|
||
@cindex deleting windows implicitly
|
||
|
||
The above commands delete windows explicitly. However, Emacs may also
|
||
delete a window implicitly when it thinks that it's more intuitive to
|
||
eliminate it rather than showing some unrelated buffer in it. Functions
|
||
that may delete windows implicitly are @code{kill-buffer}
|
||
(@pxref{Killing Buffers}), @code{quit-restore-window} (@pxref{Quitting
|
||
Windows}) and @code{bury-buffer} (@pxref{Buffer List}). Some of these
|
||
delete a window if and only if that window is dedicated to its buffer
|
||
(@pxref{Dedicated Windows}). Others delete a window when that window
|
||
has been created by @code{display-buffer} (@pxref{Displaying Buffers}).
|
||
Some will also try to delete a window's frame together with the window,
|
||
provided there are other frames on the same terminal and the frame does
|
||
not host the active minibuffer window.
|
||
|
||
The hook described next can be used to avoid that a window gets
|
||
deleted by these functions.
|
||
|
||
@defopt window-deletable-functions
|
||
This is an abnormal hook that can be used to avoid that a window gets
|
||
deleted implicitly. The value should be a list of functions that take
|
||
two arguments. The first argument is the window about to be deleted.
|
||
The second argument, if non-@code{nil}, means that the window is the
|
||
only window on its frame and would be deleted together with its frame.
|
||
The window's buffer is current when running this hook.
|
||
|
||
If any of these functions returns @code{nil}, the window will not be
|
||
deleted and another buffer will be shown in it. This hook is run
|
||
(indirectly) by the functions @code{quit-restore-window},
|
||
@code{kill-buffer} and @code{bury-buffer}. It is not run by functions
|
||
that delete windows explicitly like @code{delete-window},
|
||
@code{delete-other-windows} or @code{delete-windows-on}.
|
||
|
||
The purpose of this hook is to give its clients a chance to save a
|
||
window or its frame from deletion because they might still want to use
|
||
that window or frame for their own purposes.
|
||
@end defopt
|
||
|
||
|
||
@node Recombining Windows
|
||
@section Recombining Windows
|
||
@cindex recombining windows
|
||
@cindex windows, recombining
|
||
|
||
When deleting the last sibling of a window @var{W}, its parent window
|
||
is deleted too, with @var{W} replacing it in the window tree. This
|
||
means that @var{W} must be recombined with its parent's siblings to
|
||
form a new window combination (@pxref{Windows and Frames}). In some
|
||
occasions, deleting a live window may even entail the deletion of two
|
||
internal windows.
|
||
|
||
@smallexample
|
||
@group
|
||
______________________________________
|
||
| ______ ____________________________ |
|
||
|| || __________________________ ||
|
||
|| ||| ___________ ___________ |||
|
||
|| |||| || ||||
|
||
|| ||||____W6_____||_____W7____||||
|
||
|| |||____________W4____________|||
|
||
|| || __________________________ ||
|
||
|| ||| |||
|
||
|| ||| |||
|
||
|| |||____________W5____________|||
|
||
||__W2__||_____________W3_____________ |
|
||
|__________________W1__________________|
|
||
|
||
@end group
|
||
@end smallexample
|
||
|
||
@noindent
|
||
Deleting @var{W5} in this configuration normally causes the deletion of
|
||
@var{W3} and @var{W4}. The remaining live windows @var{W2},
|
||
@var{W6} and @var{W7} are recombined to form a new horizontal
|
||
combination with parent @var{W1}.
|
||
|
||
Sometimes, however, it makes sense to not delete a parent window like
|
||
@var{W4}. In particular, a parent window should not be removed when it
|
||
was used to preserve a combination embedded in a combination of the same
|
||
type. Such embeddings make sense to assure that when you split a window
|
||
and subsequently delete the new window, Emacs reestablishes the layout
|
||
of the associated frame as it existed before the splitting.
|
||
|
||
Consider a scenario starting with two live windows @var{W2} and
|
||
@var{W3} and their parent @var{W1}.
|
||
|
||
@smallexample
|
||
@group
|
||
______________________________________
|
||
| ____________________________________ |
|
||
|| ||
|
||
|| ||
|
||
|| ||
|
||
|| ||
|
||
|| ||
|
||
|| ||
|
||
||_________________W2_________________||
|
||
| ____________________________________ |
|
||
|| ||
|
||
|| ||
|
||
||_________________W3_________________||
|
||
|__________________W1__________________|
|
||
|
||
@end group
|
||
@end smallexample
|
||
|
||
@noindent
|
||
Split @var{W2} to make a new window @var{W4} as follows.
|
||
|
||
@smallexample
|
||
@group
|
||
______________________________________
|
||
| ____________________________________ |
|
||
|| ||
|
||
|| ||
|
||
||_________________W2_________________||
|
||
| ____________________________________ |
|
||
|| ||
|
||
|| ||
|
||
||_________________W4_________________||
|
||
| ____________________________________ |
|
||
|| ||
|
||
|| ||
|
||
||_________________W3_________________||
|
||
|__________________W1__________________|
|
||
|
||
@end group
|
||
@end smallexample
|
||
|
||
@noindent
|
||
Now, when enlarging a window vertically, Emacs tries to obtain the
|
||
corresponding space from its lower sibling, provided such a window
|
||
exists. In our scenario, enlarging @var{W4} will steal space from
|
||
@var{W3}.
|
||
|
||
@smallexample
|
||
@group
|
||
______________________________________
|
||
| ____________________________________ |
|
||
|| ||
|
||
|| ||
|
||
||_________________W2_________________||
|
||
| ____________________________________ |
|
||
|| ||
|
||
|| ||
|
||
|| ||
|
||
|| ||
|
||
||_________________W4_________________||
|
||
| ____________________________________ |
|
||
||_________________W3_________________||
|
||
|__________________W1__________________|
|
||
|
||
@end group
|
||
@end smallexample
|
||
|
||
@noindent
|
||
Deleting @var{W4} will now give its entire space to @var{W2},
|
||
including the space earlier stolen from @var{W3}.
|
||
|
||
@smallexample
|
||
@group
|
||
______________________________________
|
||
| ____________________________________ |
|
||
|| ||
|
||
|| ||
|
||
|| ||
|
||
|| ||
|
||
|| ||
|
||
|| ||
|
||
|| ||
|
||
|| ||
|
||
||_________________W2_________________||
|
||
| ____________________________________ |
|
||
||_________________W3_________________||
|
||
|__________________W1__________________|
|
||
|
||
@end group
|
||
@end smallexample
|
||
|
||
@noindent
|
||
This can be counterintuitive, in particular if @var{W4} were used for
|
||
displaying a buffer only temporarily (@pxref{Temporary Displays}), and
|
||
you want to continue working with the initial layout.
|
||
|
||
The behavior can be fixed by making a new parent window when splitting
|
||
@var{W2}. The variable described next allows that to be done.
|
||
|
||
@defopt window-combination-limit
|
||
This variable controls whether splitting a window shall make a new
|
||
parent window. The following values are recognized:
|
||
|
||
@table @code
|
||
@item nil
|
||
This means that the new live window is allowed to share the existing
|
||
parent window, if one exists, provided the split occurs in the same
|
||
direction as the existing window combination (otherwise, a new internal
|
||
window is created anyway).
|
||
|
||
@item window-size
|
||
This means that @code{display-buffer} makes a new parent window when
|
||
it splits a window and is passed a @code{window-height} or
|
||
@code{window-width} entry in the @var{alist} argument (@pxref{Buffer
|
||
Display Action Functions}). Otherwise, window splitting behaves as
|
||
for a value of @code{nil}.
|
||
|
||
@item temp-buffer-resize
|
||
In this case @code{with-temp-buffer-window} makes a new parent window
|
||
when it splits a window and @code{temp-buffer-resize-mode} is enabled
|
||
(@pxref{Temporary Displays}). Otherwise, window splitting behaves as
|
||
for @code{nil}.
|
||
|
||
@item temp-buffer
|
||
In this case @code{with-temp-buffer-window} always makes a new parent
|
||
window when it splits an existing window (@pxref{Temporary Displays}).
|
||
Otherwise, window splitting behaves as for @code{nil}.
|
||
|
||
@item display-buffer
|
||
This means that when @code{display-buffer} (@pxref{Choosing Window})
|
||
splits a window it always makes a new parent window. Otherwise, window
|
||
splitting behaves as for @code{nil}.
|
||
|
||
@item t
|
||
This means that splitting a window always creates a new parent window.
|
||
Thus, if the value of this variable is at all times @code{t}, then at
|
||
all times every window tree is a binary tree (a tree where each window
|
||
except the root window has exactly one sibling).
|
||
@end table
|
||
|
||
The default is @code{window-size}. Other values are reserved for future
|
||
use.
|
||
|
||
If, as a consequence of this variable's setting, @code{split-window}
|
||
makes a new parent window, it also calls
|
||
@code{set-window-combination-limit} (see below) on the newly-created
|
||
internal window. This affects how the window tree is rearranged when
|
||
the child windows are deleted (see below).
|
||
@end defopt
|
||
|
||
If @code{window-combination-limit} is @code{t}, splitting @var{W2} in
|
||
the initial configuration of our scenario would have produced this:
|
||
|
||
@smallexample
|
||
@group
|
||
______________________________________
|
||
| ____________________________________ |
|
||
|| __________________________________ ||
|
||
||| |||
|
||
|||________________W2________________|||
|
||
|| __________________________________ ||
|
||
||| |||
|
||
|||________________W4________________|||
|
||
||_________________W5_________________||
|
||
| ____________________________________ |
|
||
|| ||
|
||
|| ||
|
||
||_________________W3_________________||
|
||
|__________________W1__________________|
|
||
|
||
@end group
|
||
@end smallexample
|
||
|
||
@noindent
|
||
A new internal window @var{W5} has been created; its children are
|
||
@var{W2} and the new live window @var{W4}. Now, @var{W2} is the only
|
||
sibling of @var{W4}, so enlarging @var{W4} will try to shrink
|
||
@var{W2}, leaving @var{W3} unaffected. Observe that @var{W5}
|
||
represents a vertical combination of two windows embedded in the
|
||
vertical combination @var{W1}.
|
||
|
||
@cindex window combination limit
|
||
@defun set-window-combination-limit window limit
|
||
This function sets the @dfn{combination limit} of the window
|
||
@var{window} to @var{limit}. This value can be retrieved via the
|
||
function @code{window-combination-limit}. See below for its effects;
|
||
note that it is only meaningful for internal windows. The
|
||
@code{split-window} function automatically calls this function, passing
|
||
it @code{t} as @var{limit}, provided the value of the variable
|
||
@code{window-combination-limit} is @code{t} when it is called.
|
||
@end defun
|
||
|
||
@defun window-combination-limit window
|
||
This function returns the combination limit for @var{window}.
|
||
|
||
The combination limit is meaningful only for an internal window. If it
|
||
is @code{nil}, then Emacs is allowed to automatically delete
|
||
@var{window}, in response to a window deletion, in order to group the
|
||
child windows of @var{window} with its sibling windows to form a new
|
||
window combination. If the combination limit is @code{t}, the child
|
||
windows of @var{window} are never automatically recombined with its
|
||
siblings.
|
||
|
||
If, in the configuration shown at the beginning of this section, the
|
||
combination limit of @var{W4} (the parent window of @var{W6} and
|
||
@var{W7}) is @code{t}, deleting @var{W5} will not implicitly delete
|
||
@var{W4} too.
|
||
@end defun
|
||
|
||
Alternatively, the problems sketched above can be avoided by always
|
||
resizing all windows in the same combination whenever one of its windows
|
||
is split or deleted. This also permits splitting windows that would be
|
||
otherwise too small for such an operation.
|
||
|
||
@defopt window-combination-resize
|
||
If this variable is @code{nil}, @code{split-window} can only split a
|
||
window (denoted by @var{window}) if @var{window}'s screen area is large
|
||
enough to accommodate both itself and the new window.
|
||
|
||
If this variable is @code{t}, @code{split-window} tries to resize all
|
||
windows that are part of the same combination as @var{window}, in order
|
||
to accommodate the new window. In particular, this may allow
|
||
@code{split-window} to succeed even if @var{window} is a fixed-size
|
||
window or too small to ordinarily split. Furthermore, subsequently
|
||
resizing or deleting @var{window} may resize all other windows in its
|
||
combination.
|
||
|
||
The default is @code{nil}. Other values are reserved for future use. A
|
||
specific split operation may ignore the value of this variable if it is
|
||
affected by a non-@code{nil} value of @code{window-combination-limit}.
|
||
@end defopt
|
||
|
||
To illustrate the effect of @code{window-combination-resize}, consider
|
||
the following frame layout.
|
||
|
||
@smallexample
|
||
@group
|
||
______________________________________
|
||
| ____________________________________ |
|
||
|| ||
|
||
|| ||
|
||
|| ||
|
||
|| ||
|
||
||_________________W2_________________||
|
||
| ____________________________________ |
|
||
|| ||
|
||
|| ||
|
||
|| ||
|
||
|| ||
|
||
||_________________W3_________________||
|
||
|__________________W1__________________|
|
||
|
||
@end group
|
||
@end smallexample
|
||
|
||
@noindent
|
||
If @code{window-combination-resize} is @code{nil}, splitting window
|
||
@var{W3} leaves the size of @var{W2} unchanged:
|
||
|
||
@smallexample
|
||
@group
|
||
______________________________________
|
||
| ____________________________________ |
|
||
|| ||
|
||
|| ||
|
||
|| ||
|
||
|| ||
|
||
||_________________W2_________________||
|
||
| ____________________________________ |
|
||
|| ||
|
||
||_________________W3_________________||
|
||
| ____________________________________ |
|
||
|| ||
|
||
||_________________W4_________________||
|
||
|__________________W1__________________|
|
||
|
||
@end group
|
||
@end smallexample
|
||
|
||
@noindent
|
||
If @code{window-combination-resize} is @code{t}, splitting @var{W3}
|
||
instead leaves all three live windows with approximately the same
|
||
height:
|
||
|
||
@smallexample
|
||
@group
|
||
______________________________________
|
||
| ____________________________________ |
|
||
|| ||
|
||
|| ||
|
||
||_________________W2_________________||
|
||
| ____________________________________ |
|
||
|| ||
|
||
|| ||
|
||
||_________________W3_________________||
|
||
| ____________________________________ |
|
||
|| ||
|
||
|| ||
|
||
||_________________W4_________________||
|
||
|__________________W1__________________|
|
||
|
||
@end group
|
||
@end smallexample
|
||
|
||
@noindent
|
||
Deleting any of the live windows @var{W2}, @var{W3} or @var{W4} will
|
||
distribute its space proportionally among the two remaining live
|
||
windows.
|
||
|
||
|
||
@node Cyclic Window Ordering
|
||
@section Cyclic Ordering of Windows
|
||
@cindex cyclic ordering of windows
|
||
@cindex ordering of windows, cyclic
|
||
@cindex window ordering, cyclic
|
||
|
||
When you use the command @w{@kbd{C-x o}} (@code{other-window}) to select
|
||
some other window, it moves through live windows in a specific order.
|
||
For any given configuration of windows, this order never varies. It
|
||
is called the @dfn{cyclic ordering of windows}.
|
||
|
||
The ordering is determined by a depth-first traversal of each frame's
|
||
window tree, retrieving the live windows which are the leaf nodes of the
|
||
tree (@pxref{Windows and Frames}). If the minibuffer is active, the
|
||
minibuffer window is included too. The ordering is cyclic, so the last
|
||
window in the sequence is followed by the first one.
|
||
|
||
@defun next-window &optional window minibuf all-frames
|
||
@cindex minibuffer window, and @code{next-window}
|
||
This function returns a live window, the one following @var{window} in
|
||
the cyclic ordering of windows. @var{window} should be a live window;
|
||
if omitted or @code{nil}, it defaults to the selected window.
|
||
|
||
The optional argument @var{minibuf} specifies whether minibuffer windows
|
||
should be included in the cyclic ordering. Normally, when @var{minibuf}
|
||
is @code{nil}, a minibuffer window is included only if it is currently
|
||
active; this matches the behavior of @w{@kbd{C-x o}}. (Note that a
|
||
minibuffer window is active as long as its minibuffer is in use; see
|
||
@ref{Minibuffers}).
|
||
|
||
If @var{minibuf} is @code{t}, the cyclic ordering includes all
|
||
minibuffer windows. If @var{minibuf} is neither @code{t} nor
|
||
@code{nil}, minibuffer windows are not included even if they are active.
|
||
|
||
The optional argument @var{all-frames} specifies which frames to
|
||
consider:
|
||
|
||
@itemize @bullet
|
||
@item @code{nil}
|
||
means to consider windows on @var{window}'s frame. If the minibuffer
|
||
window is considered (as specified by the @var{minibuf} argument),
|
||
then frames that share the minibuffer window are considered too.
|
||
|
||
@item @code{t}
|
||
means to consider windows on all existing frames.
|
||
|
||
@item @code{visible}
|
||
means to consider windows on all visible frames.
|
||
|
||
@item 0
|
||
means to consider windows on all visible or iconified frames.
|
||
|
||
@item A frame
|
||
means to consider windows on that specific frame.
|
||
|
||
@item Anything else
|
||
means to consider windows on @var{window}'s frame, and no others.
|
||
@end itemize
|
||
|
||
If more than one frame is considered, the cyclic ordering is obtained
|
||
by appending the orderings for those frames, in the same order as the
|
||
list of all live frames (@pxref{Finding All Frames}).
|
||
@end defun
|
||
|
||
@defun previous-window &optional window minibuf all-frames
|
||
This function returns a live window, the one preceding @var{window} in
|
||
the cyclic ordering of windows. The other arguments are handled like
|
||
in @code{next-window}.
|
||
@end defun
|
||
|
||
@deffn Command other-window count &optional all-frames
|
||
This function selects a live window, one @var{count} places from the
|
||
selected window in the cyclic ordering of windows. If @var{count} is
|
||
a positive number, it skips @var{count} windows forwards; if
|
||
@var{count} is negative, it skips @minus{}@var{count} windows
|
||
backwards; if @var{count} is zero, that simply re-selects the selected
|
||
window. When called interactively, @var{count} is the numeric prefix
|
||
argument.
|
||
|
||
The optional argument @var{all-frames} has the same meaning as in
|
||
@code{next-window}, like a @code{nil} @var{minibuf} argument to
|
||
@code{next-window}.
|
||
|
||
If the @code{other-window} parameter of the selected window is a
|
||
function, and @code{ignore-window-parameters} is @code{nil}, that
|
||
function will be called with the arguments @var{count} and
|
||
@var{all-frames} instead of the normal operation of this function.
|
||
|
||
Otherwise, this function does not select a window for which the function
|
||
@code{window-no-other-p} (see next) returns @code{nil}.
|
||
@end deffn
|
||
|
||
@defun window-no-other-p &optional window
|
||
This function returns non-@code{nil} if @var{window} should not be used
|
||
as ``other'' window by commands like @code{other-window} or functions
|
||
like @code{get-lru-window} (see below). It's also called when deleting
|
||
the selected window (@pxref{Deleting Windows}) and a new selected window
|
||
has to be chosen.
|
||
|
||
More precisely, this function returns non-@code{nil} if the
|
||
@code{no-other-window} parameter of @var{window} is non-@code{nil} and
|
||
@code{ignore-window-parameters} is @code{nil}. It returns @code{nil} in
|
||
any other case.
|
||
|
||
Note that if this function returns @code{nil}, this does not necessarily
|
||
mean that @var{window} can be selected. A tooltip window (@pxref{Basic
|
||
Windows}), for example, has its @code{no-other-window} parameter set to
|
||
@code{t} by default but cannot be selected.
|
||
@end defun
|
||
|
||
@defun walk-windows fun &optional minibuf all-frames
|
||
This function calls the function @var{fun} once for each live window,
|
||
with the window as the argument.
|
||
|
||
It follows the cyclic ordering of windows. The optional arguments
|
||
@var{minibuf} and @var{all-frames} specify the set of windows
|
||
included; these have the same arguments as in @code{next-window}. If
|
||
@var{all-frames} specifies a frame, the first window walked is the
|
||
first window on that frame (the one returned by
|
||
@code{frame-first-window}), not necessarily the selected window.
|
||
|
||
If @var{fun} changes the window configuration by splitting or deleting
|
||
windows, that does not alter the set of windows walked, which is
|
||
determined prior to calling @var{fun} for the first time.
|
||
@end defun
|
||
|
||
@defun one-window-p &optional no-mini all-frames
|
||
This function returns @code{t} if the selected window is the only live
|
||
window, and @code{nil} otherwise.
|
||
|
||
If the minibuffer window is active, it is normally considered (so that
|
||
this function returns @code{nil}). However, if the optional argument
|
||
@var{no-mini} is non-@code{nil}, the minibuffer window is ignored even
|
||
if active. The optional argument @var{all-frames} has the same
|
||
meaning as for @code{next-window}.
|
||
@end defun
|
||
|
||
@cindex finding windows
|
||
The following functions return a window which satisfies some
|
||
criterion, without selecting it:
|
||
|
||
@cindex least recently used window
|
||
@defun get-lru-window &optional all-frames dedicated not-selected no-other
|
||
This function returns a live window which is heuristically the least
|
||
recently used one. The @dfn{least recently used window} is the least
|
||
recently selected one---the window whose use time is less than the use
|
||
time of all other live windows (@pxref{Selecting Windows}). The
|
||
optional argument @var{all-frames} has the same meaning as in
|
||
@code{next-window}.
|
||
|
||
If any full-width windows are present, only those windows are
|
||
considered. A minibuffer window is never a candidate. A dedicated
|
||
window (@pxref{Dedicated Windows}) is never a candidate unless the
|
||
optional argument @var{dedicated} is non-@code{nil}. The selected
|
||
window is never returned, unless it is the only candidate. However, if
|
||
the optional argument @var{not-selected} is non-@code{nil}, this
|
||
function returns @code{nil} in that case. The optional argument
|
||
@var{no-other}, if non-@code{nil}, means to never return a window for
|
||
which @code{window-no-other-p} (@pxref{Cyclic Window Ordering}) returns
|
||
non-@code{nil}.
|
||
@end defun
|
||
|
||
@cindex most recently used window
|
||
@defun get-mru-window &optional all-frames dedicated not-selected no-other
|
||
This function is like @code{get-lru-window}, but it returns the most
|
||
recently used window instead. The @dfn{most recently used window} is
|
||
the most recently selected one---the window whose use time exceeds the
|
||
use time of all other live windows (@pxref{Selecting Windows}). The
|
||
meaning of the arguments is the same as for @code{get-lru-window}.
|
||
|
||
Since in practice the most recently used window is always the selected
|
||
one, it usually makes sense to call this function with a non-@code{nil}
|
||
@var{not-selected} argument only.
|
||
@end defun
|
||
|
||
@cindex largest window
|
||
@defun get-largest-window &optional all-frames dedicated not-selected no-other
|
||
This function returns the window with the largest area (height times
|
||
width). If there are two candidate windows of the same size, it prefers
|
||
the one that comes first in the cyclic ordering of windows, starting
|
||
from the selected window. The meaning of the arguments is the same as
|
||
for @code{get-lru-window}.
|
||
@end defun
|
||
|
||
@cindex window that satisfies a predicate
|
||
@cindex conditional selection of windows
|
||
@defun get-window-with-predicate predicate &optional minibuf all-frames default
|
||
This function calls the function @var{predicate} for each of the
|
||
windows in the cyclic order of windows in turn, passing it the window
|
||
as an argument. If the predicate returns non-@code{nil} for any
|
||
window, this function stops and returns that window. If no such
|
||
window is found, the return value is @var{default} (which defaults to
|
||
@code{nil}).
|
||
|
||
The optional arguments @var{minibuf} and @var{all-frames} specify the
|
||
windows to search, and have the same meanings as in
|
||
@code{next-window}.
|
||
@end defun
|
||
|
||
|
||
@node Buffers and Windows
|
||
@section Buffers and Windows
|
||
@cindex examining windows
|
||
@cindex windows, controlling precisely
|
||
@cindex buffers, controlled in windows
|
||
|
||
This section describes low-level functions for examining and setting
|
||
the contents of windows. @xref{Switching Buffers}, for higher-level
|
||
functions for displaying a specific buffer in a window.
|
||
|
||
@defun window-buffer &optional window
|
||
This function returns the buffer that @var{window} is displaying. If
|
||
@var{window} is omitted or @code{nil} it defaults to the selected
|
||
window. If @var{window} is an internal window, this function returns
|
||
@code{nil}.
|
||
@end defun
|
||
|
||
@defun set-window-buffer window buffer-or-name &optional keep-margins
|
||
This function makes @var{window} display @var{buffer-or-name}.
|
||
@var{window} should be a live window; if @code{nil}, it defaults to
|
||
the selected window. @var{buffer-or-name} should be a buffer, or the
|
||
name of an existing buffer. This function does not change which
|
||
window is selected, nor does it directly change which buffer is
|
||
current (@pxref{Current Buffer}). Its return value is @code{nil}.
|
||
|
||
If @var{window} is @dfn{strongly dedicated} to a buffer and
|
||
@var{buffer-or-name} does not specify that buffer, this function
|
||
signals an error. @xref{Dedicated Windows}.
|
||
|
||
By default, this function resets @var{window}'s position, display
|
||
margins, fringe widths, and scroll bar settings, based on the local
|
||
variables in the specified buffer. However, if the optional argument
|
||
@var{keep-margins} is non-@code{nil}, it leaves @var{window}'s display
|
||
margins, fringes and scroll bar settings alone.
|
||
|
||
When writing an application, you should normally use
|
||
@code{display-buffer} (@pxref{Choosing Window}) or the higher-level
|
||
functions described in @ref{Switching Buffers}, instead of calling
|
||
@code{set-window-buffer} directly.
|
||
|
||
This runs @code{window-scroll-functions}, followed by
|
||
@code{window-configuration-change-hook}. @xref{Window Hooks}.
|
||
@end defun
|
||
|
||
@defvar buffer-display-count
|
||
This buffer-local variable records the number of times a buffer has been
|
||
displayed in a window. It is incremented each time
|
||
@code{set-window-buffer} is called for the buffer.
|
||
@end defvar
|
||
|
||
@defvar buffer-display-time
|
||
This buffer-local variable records the time at which a buffer was last
|
||
displayed in a window. The value is @code{nil} if the buffer has
|
||
never been displayed. It is updated each time
|
||
@code{set-window-buffer} is called for the buffer, with the value
|
||
returned by @code{current-time} (@pxref{Time of Day}).
|
||
@end defvar
|
||
|
||
@defun get-buffer-window &optional buffer-or-name all-frames
|
||
This function returns the first window displaying @var{buffer-or-name}
|
||
in the cyclic ordering of windows, starting from the selected window
|
||
(@pxref{Cyclic Window Ordering}). If no such window exists, the
|
||
return value is @code{nil}.
|
||
|
||
@var{buffer-or-name} should be a buffer or the name of a buffer; if
|
||
omitted or @code{nil}, it defaults to the current buffer. The
|
||
optional argument @var{all-frames} specifies which windows to
|
||
consider:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
@code{t} means consider windows on all existing frames.
|
||
@item
|
||
@code{visible} means consider windows on all visible frames.
|
||
@item
|
||
0 means consider windows on all visible or iconified frames.
|
||
@item
|
||
A frame means consider windows on that frame only.
|
||
@item
|
||
Any other value means consider windows on the selected frame.
|
||
@end itemize
|
||
|
||
Note that these meanings differ slightly from those of the
|
||
@var{all-frames} argument to @code{next-window} (@pxref{Cyclic Window
|
||
Ordering}). This function may be changed in a future version of Emacs
|
||
to eliminate this discrepancy.
|
||
@end defun
|
||
|
||
@defun get-buffer-window-list &optional buffer-or-name minibuf all-frames
|
||
This function returns a list of all windows currently displaying
|
||
@var{buffer-or-name}. @var{buffer-or-name} should be a buffer or the
|
||
name of an existing buffer. If omitted or @code{nil}, it defaults to
|
||
the current buffer. If the currently selected window displays
|
||
@var{buffer-or-name}, it will be the first in the list returned by
|
||
this function.
|
||
|
||
The arguments @var{minibuf} and @var{all-frames} have the same
|
||
meanings as in the function @code{next-window} (@pxref{Cyclic Window
|
||
Ordering}). Note that the @var{all-frames} argument does @emph{not}
|
||
behave exactly like in @code{get-buffer-window}.
|
||
@end defun
|
||
|
||
@deffn Command replace-buffer-in-windows &optional buffer-or-name
|
||
This command replaces @var{buffer-or-name} with some other buffer, in
|
||
all windows displaying it. @var{buffer-or-name} should be a buffer, or
|
||
the name of an existing buffer; if omitted or @code{nil}, it defaults to
|
||
the current buffer.
|
||
|
||
The replacement buffer in each window is usually chosen via
|
||
@code{switch-to-prev-buffer} (@pxref{Window History}). With the
|
||
exception of side windows (@pxref{Side Windows}), any dedicated window
|
||
displaying @var{buffer-or-name} is deleted if possible (@pxref{Dedicated
|
||
Windows}). If such a window is the only window on its frame and there
|
||
are other frames on the same terminal, the frame is deleted as well. If
|
||
the dedicated window is the only window on the only frame on its
|
||
terminal, the buffer is replaced anyway.
|
||
|
||
The main purpose of this function is to decide what to do with windows
|
||
whose buffers are about to be killed by @code{kill-buffer}
|
||
(@pxref{Killing Buffers}). It will, however, also remove the buffer
|
||
specified by @var{buffer-or-name} from the lists of previous and next
|
||
buffers (@pxref{Window History}) of all windows (including dead windows
|
||
that are only referenced by window configurations) and remove any
|
||
@code{quit-restore} or @code{quit-restore-prev} parameters
|
||
(@pxref{Window Parameters}) referencing that buffer.
|
||
|
||
This function does not replace the buffer specified by
|
||
@var{buffer-or-name} in any minibuffer window showing it, nor does it
|
||
delete minibuffer windows or minibuffer frames. It removes, however,
|
||
that buffer from the lists of previous and next buffers of all
|
||
minibuffer windows.
|
||
@end deffn
|
||
|
||
By default, @code{replace-buffer-in-windows} deletes only windows
|
||
dedicated to their buffers and ignores any @code{quit-restore} or
|
||
@code{quit-restore-prev} parameters of the windows it works on. The
|
||
following option is useful for circumventing these restrictions.
|
||
|
||
@defopt kill-buffer-quit-windows
|
||
If this option is @code{nil}, @code{kill-buffer} (and in consequence
|
||
@code{replace-buffer-in-windows}) may only delete windows that are
|
||
dedicated to the buffer about to be killed. If this is non-@code{nil},
|
||
@code{replace-buffer-in-windows} has @code{quit-restore-window}
|
||
(@pxref{Quitting Windows}) deal with any such window. That function may
|
||
delete such a window even if it's not dedicated to its buffer. Also,
|
||
@code{delete-windows-on} will use @code{quit-restore-window} as fallback
|
||
when a window cannot be deleted and another buffer must be shown in it.
|
||
@end defopt
|
||
|
||
|
||
@node Switching Buffers
|
||
@section Switching to a Buffer in a Window
|
||
@cindex switching to a buffer
|
||
|
||
This section describes high-level functions for switching to a specified
|
||
buffer in some window. In general, ``switching to a buffer'' means to
|
||
(1) show the buffer in some window, (2) make that window the selected
|
||
window (and its frame the selected frame), and (3) make the buffer the
|
||
current buffer.
|
||
|
||
Do @emph{not} use these functions to make a buffer temporarily
|
||
current just so a Lisp program can access or modify it. They have
|
||
side-effects, such as changing window histories (@pxref{Window
|
||
History}), which will surprise the user if used that way. If you want
|
||
to make a buffer current to modify it in Lisp, use
|
||
@code{with-current-buffer}, @code{save-current-buffer}, or
|
||
@code{set-buffer}. @xref{Current Buffer}.
|
||
|
||
@deffn Command switch-to-buffer buffer-or-name &optional norecord force-same-window
|
||
This command attempts to display @var{buffer-or-name} in the selected
|
||
window and make it the current buffer. It is often used interactively
|
||
(as the binding of @kbd{C-x b}), as well as in Lisp programs. The
|
||
return value is the buffer switched to.
|
||
|
||
If @var{buffer-or-name} is @code{nil}, it defaults to the buffer
|
||
returned by @code{other-buffer} (@pxref{Buffer List}). If
|
||
@var{buffer-or-name} is a string that is not the name of any existing
|
||
buffer, this function creates a new buffer with that name; the new
|
||
buffer's major mode is determined by the variable @code{major-mode}
|
||
(@pxref{Major Modes}).
|
||
|
||
Normally, the specified buffer is put at the front of the buffer
|
||
list---both the global buffer list and the selected frame's buffer
|
||
list (@pxref{Buffer List}). However, this is not done if the
|
||
optional argument @var{norecord} is non-@code{nil}.
|
||
|
||
Sometimes, the selected window may not be suitable for displaying the
|
||
buffer. This happens if the selected window is a minibuffer window, or
|
||
if the selected window is strongly dedicated to its buffer
|
||
(@pxref{Dedicated Windows}). In such cases, the command normally tries
|
||
to display the buffer in some other window, by invoking
|
||
@code{pop-to-buffer} (see below).
|
||
|
||
If the optional argument @var{force-same-window} is non-@code{nil} and
|
||
the selected window is not suitable for displaying the buffer, this
|
||
function always signals an error when called non-interactively. In
|
||
interactive use, if the selected window is a minibuffer window, this
|
||
function will try to use some other window instead. If the selected
|
||
window is strongly dedicated to its buffer, the option
|
||
@code{switch-to-buffer-in-dedicated-window} described next can be used
|
||
to proceed.
|
||
@end deffn
|
||
|
||
@defopt switch-to-buffer-in-dedicated-window
|
||
This option, if non-@code{nil}, allows @code{switch-to-buffer} to
|
||
proceed when called interactively and the selected window is strongly
|
||
dedicated to its buffer.
|
||
|
||
The following values are respected:
|
||
|
||
@table @code
|
||
@item nil
|
||
Disallows switching and signals an error as in non-interactive use.
|
||
|
||
@item prompt
|
||
Prompts the user whether to allow switching.
|
||
|
||
@item pop
|
||
Invokes @code{pop-to-buffer} to proceed.
|
||
|
||
@item t
|
||
Marks the selected window as non-dedicated and proceeds.
|
||
@end table
|
||
|
||
This option does not affect non-interactive calls of
|
||
@code{switch-to-buffer}.
|
||
@end defopt
|
||
|
||
By default, @code{switch-to-buffer} tries to preserve
|
||
@code{window-point}. This behavior can be tuned using the following
|
||
option.
|
||
|
||
@defopt switch-to-buffer-preserve-window-point
|
||
If this variable is @code{nil}, @code{switch-to-buffer} displays the
|
||
buffer specified by @var{buffer-or-name} at the position of that
|
||
buffer's @code{point}. If this variable is @code{already-displayed}, it
|
||
tries to display the buffer at its previous position in the selected
|
||
window, provided the buffer is currently displayed in some other window
|
||
on any visible or iconified frame. If this variable is @code{t},
|
||
@code{switch-to-buffer} unconditionally tries to display the buffer at
|
||
its previous position in the selected window.
|
||
|
||
This variable is ignored if the buffer is already displayed in the
|
||
selected window or never appeared in it before, or if
|
||
@code{switch-to-buffer} calls @code{pop-to-buffer} to display the
|
||
buffer.
|
||
@end defopt
|
||
|
||
@defopt switch-to-buffer-obey-display-actions
|
||
If this variable is non-@code{nil}, @code{switch-to-buffer} respects
|
||
display actions specified by @code{display-buffer-overriding-action},
|
||
@code{display-buffer-alist} and other display related variables.
|
||
@end defopt
|
||
|
||
The next two commands are similar to @code{switch-to-buffer}, except for
|
||
the described features.
|
||
|
||
@deffn Command switch-to-buffer-other-window buffer-or-name &optional norecord
|
||
This function displays the buffer specified by @var{buffer-or-name} in
|
||
some window other than the selected window. It uses the function
|
||
@code{pop-to-buffer} internally (see below).
|
||
|
||
If the selected window already displays the specified buffer, it
|
||
continues to do so, but another window is nonetheless found to display
|
||
it as well.
|
||
|
||
The @var{buffer-or-name} and @var{norecord} arguments have the same
|
||
meanings as in @code{switch-to-buffer}.
|
||
@end deffn
|
||
|
||
@deffn Command switch-to-buffer-other-frame buffer-or-name &optional norecord
|
||
This function displays the buffer specified by @var{buffer-or-name} in a
|
||
new frame. It uses the function @code{pop-to-buffer} internally (see
|
||
below).
|
||
|
||
If the specified buffer is already displayed in another window, in any
|
||
frame on the current terminal, this switches to that window instead of
|
||
creating a new frame. However, the selected window is never used for
|
||
this.
|
||
|
||
The @var{buffer-or-name} and @var{norecord} arguments have the same
|
||
meanings as in @code{switch-to-buffer}.
|
||
@end deffn
|
||
|
||
The above commands use the function @code{pop-to-buffer}, which
|
||
flexibly displays a buffer in some window and selects that window for
|
||
editing. In turn, @code{pop-to-buffer} uses @code{display-buffer} for
|
||
displaying the buffer. Hence, all the variables affecting
|
||
@code{display-buffer} will affect it as well. @xref{Choosing Window},
|
||
for the documentation of @code{display-buffer}.
|
||
|
||
@deffn Command pop-to-buffer buffer-or-name &optional action norecord
|
||
This function makes @var{buffer-or-name} the current buffer and
|
||
displays it in some window, preferably not the window currently
|
||
selected. It then selects the displaying window. If that window is
|
||
on a different graphical frame, that frame is given input focus if
|
||
possible (@pxref{Input Focus}).
|
||
|
||
If @var{buffer-or-name} is @code{nil}, it defaults to the buffer
|
||
returned by @code{other-buffer} (@pxref{Buffer List}). If
|
||
@var{buffer-or-name} is a string that is not the name of any existing
|
||
buffer, this function creates a new buffer with that name; the new
|
||
buffer's major mode is determined by the variable @code{major-mode}
|
||
(@pxref{Major Modes}). In any case, that buffer is made current and
|
||
returned, even when no suitable window was found to display it.
|
||
|
||
If @var{action} is non-@code{nil}, it should be a display action to
|
||
pass to @code{display-buffer} (@pxref{Choosing Window}).
|
||
Alternatively, a non-@code{nil}, non-list value means to pop to a
|
||
window other than the selected one---even if the buffer is already
|
||
displayed in the selected window.
|
||
|
||
Like @code{switch-to-buffer}, this function updates the buffer list
|
||
unless @var{norecord} is non-@code{nil}.
|
||
@end deffn
|
||
|
||
|
||
@node Displaying Buffers
|
||
@section Displaying a Buffer in a Suitable Window
|
||
@cindex buffer display
|
||
@cindex displaying a buffer
|
||
|
||
This section describes lower-level functions Emacs uses to find or
|
||
create a window for displaying a specified buffer. The common
|
||
workhorse of these functions is @code{display-buffer} which eventually
|
||
handles all incoming requests for buffer display (@pxref{Choosing
|
||
Window}).
|
||
|
||
@code{display-buffer} delegates the task of finding a suitable
|
||
window to so-called action functions (@pxref{Buffer Display Action
|
||
Functions}). First, @code{display-buffer} compiles a so-called action
|
||
alist---a special association list that action functions can use to
|
||
fine-tune their behavior. Then it passes that alist on to each action
|
||
function it calls (@pxref{Buffer Display Action Alists}).
|
||
|
||
The behavior of @code{display-buffer} is highly customizable. To
|
||
understand how customizations are used in practice, you may wish to
|
||
study examples illustrating the order of precedence which
|
||
@code{display-buffer} uses to call action functions (@pxref{Precedence
|
||
of Action Functions}). To avoid conflicts between Lisp programs
|
||
calling @code{display-buffer} and user customizations of its behavior,
|
||
it may make sense to follow a number of guidelines which are sketched
|
||
in the final part of this section (@pxref{The Zen of Buffer Display}).
|
||
|
||
@menu
|
||
* Choosing Window:: How to choose a window for displaying a buffer.
|
||
* Buffer Display Action Functions:: Support functions for buffer display.
|
||
* Buffer Display Action Alists:: Alists for fine-tuning buffer display.
|
||
* Choosing Window Options:: Extra options affecting how buffers are displayed.
|
||
* Precedence of Action Functions:: Examples to explain the precedence of
|
||
action functions.
|
||
* The Zen of Buffer Display:: How to avoid that buffers get lost in between
|
||
windows.
|
||
@end menu
|
||
|
||
|
||
@node Choosing Window
|
||
@subsection Choosing a Window for Displaying a Buffer
|
||
|
||
The command @code{display-buffer} flexibly chooses a window for
|
||
display, and displays a specified buffer in that window. It can be
|
||
called interactively, via the key binding @kbd{C-x 4 C-o}. It is also
|
||
used as a subroutine by many functions and commands, including
|
||
@code{switch-to-buffer} and @code{pop-to-buffer} (@pxref{Switching
|
||
Buffers}).
|
||
|
||
@cindex buffer display display action
|
||
@cindex display action
|
||
This command performs several complex steps to find a window to
|
||
display in. These steps are described by means of @dfn{display
|
||
actions}, which have the form @code{(@var{functions} . @var{alist})}.
|
||
Here, @var{functions} is either a single function or a list of
|
||
functions, referred to as ``action functions'' (@pxref{Buffer Display
|
||
Action Functions}); and @var{alist} is an association list, referred
|
||
to as ``action alist'' (@pxref{Buffer Display Action Alists}).
|
||
@xref{The Zen of Buffer Display}, for samples of display actions.
|
||
|
||
An action function accepts two arguments: the buffer to display and
|
||
an action alist. It attempts to display the buffer in some window,
|
||
picking or creating a window according to its own criteria. If
|
||
successful, it returns the window; otherwise, it returns @code{nil}.
|
||
|
||
@code{display-buffer} works by combining display actions from
|
||
several sources, and calling the action functions in turn, until one
|
||
of them manages to display the buffer and returns a non-@code{nil}
|
||
value.
|
||
|
||
@deffn Command display-buffer buffer-or-name &optional action frame
|
||
This command makes @var{buffer-or-name} appear in some window, without
|
||
selecting the window or making the buffer current. The argument
|
||
@var{buffer-or-name} must be a buffer or the name of an existing
|
||
buffer. The return value is the window chosen to display the buffer,
|
||
or @code{nil} if no suitable window was found.
|
||
|
||
The optional argument @var{action}, if non-@code{nil}, should normally
|
||
be a display action (described above). @code{display-buffer} builds a
|
||
list of action functions and an action alist, by consolidating display
|
||
actions from the following sources (in order of their precedence,
|
||
from highest to lowest):
|
||
|
||
@itemize
|
||
@item
|
||
The variable @code{display-buffer-overriding-action}.
|
||
|
||
@item
|
||
The user option @code{display-buffer-alist}.
|
||
|
||
@item
|
||
The @var{action} argument.
|
||
|
||
@item
|
||
The user option @code{display-buffer-base-action}.
|
||
|
||
@item
|
||
The constant @code{display-buffer-fallback-action}.
|
||
@end itemize
|
||
|
||
@noindent
|
||
In practice this means that @code{display-buffer} builds a list of all
|
||
action functions specified by these display actions. The first
|
||
element of this list is the first action function specified by
|
||
@code{display-buffer-overriding-action}, if any. Its last element is
|
||
@code{display-buffer-pop-up-frame}---the last action function
|
||
specified by @code{display-buffer-fallback-action}. Duplicates are
|
||
not removed from this list---hence one and the same action function
|
||
may be called multiple times during one call of @code{display-buffer}.
|
||
|
||
@code{display-buffer} calls the action functions specified by this
|
||
list in turn, passing the buffer as the first argument and the
|
||
combined action alist as the second argument, until one of the
|
||
functions returns non-@code{nil}. @xref{Precedence of Action
|
||
Functions}, for examples how display actions specified by different
|
||
sources are processed by @code{display-buffer}.
|
||
|
||
Note that the second argument is always the list of @emph{all} action
|
||
alist entries specified by the sources named above. Hence, the first
|
||
element of that list is the first action alist entry specified by
|
||
@code{display-buffer-overriding-action}, if any. Its last element is
|
||
the last alist entry of @code{display-buffer-base-action}, if any (the
|
||
action alist of @code{display-buffer-fallback-action} is empty).
|
||
|
||
Note also, that the combined action alist may contain duplicate
|
||
entries and entries for the same key with different values. As a
|
||
rule, action functions always use the first association of a key they
|
||
find. Hence, the association an action function uses is not
|
||
necessarily the association provided by the display action that
|
||
specified that action function,
|
||
|
||
The argument @var{action} can also have a non-@code{nil}, non-list
|
||
value. This has the special meaning that the buffer should be
|
||
displayed in a window other than the selected one, even if the
|
||
selected window is already displaying it. If called interactively
|
||
with a prefix argument, @var{action} is @code{t}. Lisp programs
|
||
should always supply a list value.
|
||
|
||
The optional argument @var{frame}, if non-@code{nil}, specifies which
|
||
frames to check when deciding whether the buffer is already displayed.
|
||
It is equivalent to adding an element @w{@code{(reusable-frames
|
||
. @var{frame})}} to the action alist of @var{action} (@pxref{Buffer
|
||
Display Action Alists}). The @var{frame} argument is provided for
|
||
compatibility reasons, Lisp programs should not use it.
|
||
@end deffn
|
||
|
||
@defvar display-buffer-overriding-action
|
||
The value of this variable should be a display action, which is
|
||
treated with the highest priority by @code{display-buffer}. The
|
||
default value is an empty display action, i.e., @w{@code{(nil . nil)}}.
|
||
@end defvar
|
||
|
||
@defopt display-buffer-alist
|
||
The value of this option is an alist mapping conditions to display
|
||
actions. Each condition is passed to @code{buffer-match-p}
|
||
(@pxref{Buffer List}), along with the buffer name and the @var{action}
|
||
argument passed to @code{display-buffer}. If it returns a
|
||
non-@code{nil} value, then @code{display-buffer} uses the
|
||
corresponding display action to display the buffer. Caveat: if you
|
||
use @code{derived-mode} or @code{major-mode} as condition,
|
||
@code{buffer-match-p} could fail to report a match if
|
||
@code{display-buffer} is called before the major mode of the buffer is
|
||
set.
|
||
|
||
If the caller of @code{display-buffer} passes a category as a symbol
|
||
in its @var{action} argument, then you can use the same category in
|
||
@code{display-buffer-alist} to match buffers with different names,
|
||
for example:
|
||
|
||
@example
|
||
@group
|
||
(setopt
|
||
display-buffer-alist
|
||
(cons '((category . comint) (display-buffer-same-window))
|
||
display-buffer-alist))
|
||
|
||
(display-buffer (get-buffer-create "*my-shell*")
|
||
'(nil (category . comint)))
|
||
@end group
|
||
@end example
|
||
|
||
Regardless of the displayed buffer's name the caller defines a category
|
||
as a symbol @code{comint}. Then @code{display-buffer-alist} matches
|
||
this category for all buffers displayed with the same category.
|
||
This avoids the need to construct a complex regular expression
|
||
that matches a buffer name.
|
||
@end defopt
|
||
|
||
@defopt display-buffer-base-action
|
||
The value of this option should be a display action. This option can
|
||
be used to define a standard display action for calls to
|
||
@code{display-buffer}.
|
||
@end defopt
|
||
|
||
@defvr Constant display-buffer-fallback-action
|
||
This display action specifies the fallback behavior for
|
||
@code{display-buffer} if no other display actions are given.
|
||
@end defvr
|
||
|
||
|
||
@node Buffer Display Action Functions
|
||
@subsection Action Functions for Buffer Display
|
||
@cindex buffer display action function
|
||
@cindex action function, for buffer display
|
||
|
||
An @dfn{action function} is a function @code{display-buffer} calls for
|
||
choosing a window to display a buffer. Action functions take two
|
||
arguments: @var{buffer}, the buffer to display, and @var{alist}, an
|
||
action alist (@pxref{Buffer Display Action Alists}). They are
|
||
supposed to return a window displaying @var{buffer} if they succeed
|
||
and @code{nil} if they fail.
|
||
|
||
The following basic action functions are defined in Emacs.
|
||
|
||
@defun display-buffer-same-window buffer alist
|
||
This function tries to display @var{buffer} in the selected window.
|
||
It fails if the selected window is a minibuffer window or is dedicated
|
||
to another buffer (@pxref{Dedicated Windows}). It also fails if
|
||
@var{alist} has a non-@code{nil} @code{inhibit-same-window} entry.
|
||
@end defun
|
||
|
||
@defun display-buffer-reuse-window buffer alist
|
||
This function tries to display @var{buffer} by finding a window that
|
||
is already displaying it. Windows on the selected frame are preferred
|
||
to windows on other frames.
|
||
|
||
If @var{alist} has a non-@code{nil} @code{inhibit-same-window} entry,
|
||
the selected window is not eligible for reuse. The set of frames to
|
||
search for a window already displaying @var{buffer} can be specified
|
||
with the help of the @code{reusable-frames} action alist entry. If
|
||
@var{alist} contains no @code{reusable-frames} entry, this function
|
||
searches just the selected frame.
|
||
|
||
If this function chooses a window on another frame, it makes that
|
||
frame visible and, unless @var{alist} contains an
|
||
@code{inhibit-switch-frame} entry, raises that frame if necessary.
|
||
@end defun
|
||
|
||
@defun display-buffer-reuse-mode-window buffer alist
|
||
This function tries to display @var{buffer} by finding a window
|
||
that is displaying a buffer in a given mode.
|
||
|
||
If @var{alist} contains a @code{mode} entry, its value specifies a
|
||
major mode (a symbol) or a list of major modes. If @var{alist}
|
||
contains no @code{mode} entry, the current major mode of @var{buffer}
|
||
is used instead. A window is a candidate if it displays a buffer
|
||
whose mode derives from one of the modes specified thusly.
|
||
|
||
The behavior is also controlled by @var{alist} entries for
|
||
@code{inhibit-same-window}, @code{reusable-frames} and
|
||
@code{inhibit-switch-frame}, like @code{display-buffer-reuse-window}
|
||
does.
|
||
@end defun
|
||
|
||
@defun display-buffer-pop-up-window buffer alist
|
||
This function tries to display @var{buffer} by splitting the largest
|
||
or least recently-used window (usually located on the selected frame).
|
||
It actually performs the split by calling the function specified by
|
||
@code{split-window-preferred-function} (@pxref{Choosing Window
|
||
Options}).
|
||
|
||
The size of the new window can be adjusted by supplying
|
||
@code{window-height} and @code{window-width} entries in @var{alist}.
|
||
If @var{alist} contains a @code{preserve-size} entry, Emacs will also
|
||
try to preserve the size of the new window during future resize
|
||
operations (@pxref{Preserving Window Sizes}).
|
||
|
||
This function fails if no window can be split. More often than not,
|
||
this happens because no window is large enough to allow splitting.
|
||
Setting @code{split-height-threshold} or @code{split-width-threshold}
|
||
to lower values may help in this regard. Splitting also fails when
|
||
the selected frame has an @code{unsplittable} frame parameter;
|
||
@pxref{Buffer Parameters}.
|
||
@end defun
|
||
|
||
@defun display-buffer-in-previous-window buffer alist
|
||
This function tries to display @var{buffer} in a window where it was
|
||
displayed previously.
|
||
|
||
If @var{alist} contains a non-@code{nil} @code{inhibit-same-window}
|
||
entry, the selected window is not eligible for use. A dedicated
|
||
window is usable only if it already shows @var{buffer}. If
|
||
@var{alist} contains a @code{previous-window} entry, the window
|
||
specified by that entry is usable even if it never showed @var{buffer}
|
||
before.
|
||
|
||
If @var{alist} contains a @code{reusable-frames} entry (@pxref{Buffer
|
||
Display Action Alists}), its value determines which frames to search
|
||
for a suitable window. If @var{alist} contains no
|
||
@code{reusable-frames} entry, this function searches just the selected
|
||
frame if @code{display-buffer-reuse-frames} and @code{pop-up-frames}
|
||
are both @code{nil}; it searches all frames on the current terminal if
|
||
either of those variables is non-@code{nil}.
|
||
|
||
If more than one window qualifies as usable according to these rules,
|
||
this function makes a choice in the following order of preference:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
The window specified by any @code{previous-window} @var{alist} entry,
|
||
provided it is not the selected window.
|
||
|
||
@item
|
||
A window that showed @var{buffer} before, provided it is not the
|
||
selected window.
|
||
|
||
@item
|
||
The selected window if it is either specified by a
|
||
@code{previous-window} @var{alist} entry or showed @var{buffer}
|
||
before.
|
||
@end itemize
|
||
@end defun
|
||
|
||
@defun display-buffer-use-some-window buffer alist
|
||
This function tries to display @var{buffer} by choosing an existing
|
||
window and displaying the buffer in that window. It first tries to find
|
||
a window that has not been used recently (@pxref{Cyclic Window
|
||
Ordering}) on any frame specified by a @code{lru-frames} @var{alist}
|
||
entry, falling back to the selected frame if no such entry exists. It
|
||
also prefers windows that satisfy the constraints specified by
|
||
@code{window-min-width} and @code{window-min-height} @var{alist}
|
||
entries; preferring full-width windows if no @code{window-min-width}
|
||
entry is found. Finally, it will not return a window whose use time is
|
||
higher than that specified by any @code{lru-time} entry provided by
|
||
@var{alist}.
|
||
|
||
If no less recently used window is found, this function will try to use
|
||
some other window, preferably a large window on some visible frame. It
|
||
can fail if all windows are dedicated to other buffers (@pxref{Dedicated
|
||
Windows}).
|
||
|
||
The above describes the behavior when the @code{some-window} @var{alist}
|
||
entry is @code{lru} or @code{nil} which is the default. Another
|
||
possible value is @code{mru}. If, for example,
|
||
@code{display-buffer-base-action} is customized to @w{@code{(nil
|
||
. ((some-window . mru)))}}, then this function will prefer the most
|
||
recently used window. This will try to display several buffers from
|
||
consecutive calls of @code{display-buffer} in the same window. Consider
|
||
a configuration of three or more windows where a user wants to consult,
|
||
in a non-selected window, one after the other, the results of a query
|
||
spread among several buffers. With the @code{lru} strategy, Emacs may
|
||
continuously choose another window because the least recently used
|
||
window changes with every call of @code{display-buffer-use-some-window}.
|
||
With the @code{mru} strategy, the window chosen would always remain the
|
||
same, resulting in a predictable user experience.
|
||
@end defun
|
||
|
||
@defun display-buffer-use-least-recent-window buffer alist
|
||
This function is similar to @code{display-buffer-use-some-window}, but
|
||
will try harder to not use a recently used window. In particular,
|
||
it does not use the selected window. In addition, it will first try to
|
||
reuse a window that shows @var{buffer} already, base the decision
|
||
whether it should use a window showing another buffer on that window's
|
||
use time alone and pop up a new window if no usable window is found.
|
||
|
||
Finally, this function will bump the use time (@pxref{Selecting
|
||
Windows}) of any window it returns in order to avoid that further
|
||
invocations will use that window for showing another buffer. An
|
||
application that wants to display several buffers in a row can help this
|
||
function by providing a @code{lru-time} @var{alist} entry it has
|
||
initially set to the value of the selected window's use time. Each
|
||
invocation of this function will then bump the use time of the window
|
||
returned to a value higher than that and a subsequent invocation will
|
||
inhibit this function to use a window it returned earlier.
|
||
@end defun
|
||
|
||
@defun display-buffer-in-direction buffer alist
|
||
This function tries to display @var{buffer} at a location specified by
|
||
@var{alist}. For this purpose, @var{alist} should contain a
|
||
@code{direction} entry whose value is one of @code{left}, @code{above}
|
||
(or @code{up}), @code{right} and @code{below} (or @code{down}). Other
|
||
values are usually interpreted as @code{below}.
|
||
|
||
If @var{alist} also contains a @code{window} entry, its value
|
||
specifies a reference window. That value can be a special symbol like
|
||
@code{main} which stands for the selected frame's main window
|
||
(@pxref{Side Window Options and Functions}) or @code{root} standing
|
||
for the selected frame's root window (@pxref{Windows and Frames}). It
|
||
can also specify an arbitrary valid window. Any other value (or
|
||
omitting the @code{window} entry entirely) means to use the selected
|
||
window as reference window.
|
||
|
||
This function first tries to reuse a window in the specified direction
|
||
that already shows @var{buffer}. If no such window exists, it tries
|
||
to split the reference window in order to produce a new window in the
|
||
specified direction. If this fails as well, it will try to display
|
||
@var{buffer} in an existing window in the specified direction. In
|
||
either case, the window chosen will appear on the side of the
|
||
reference window specified by the @code{direction} entry, sharing at
|
||
least one edge with the reference window.
|
||
|
||
If the reference window is live, the edge the chosen window will share
|
||
with it is always the opposite of the one specified by the
|
||
@code{direction} entry. For example, if the value of the
|
||
@code{direction} entry is @code{left}, the chosen window's right edge
|
||
coordinate (@pxref{Coordinates and Windows}) will equal the reference
|
||
window's left edge coordinate.
|
||
|
||
If the reference window is internal, a reused window must share with
|
||
it the edge specified by the @code{direction} entry. Hence if, for
|
||
example, the reference window is the frame's root window and the value
|
||
of the @code{direction} entry is @code{left}, a reused window must be
|
||
on the left of the frame. This means that the left edge coordinate of
|
||
the chosen window and that of the reference window are the same.
|
||
|
||
A new window, however, will be created by splitting the reference
|
||
window such that the chosen window will share the opposite edge with
|
||
the reference window. In our example, a new root window would be
|
||
created with a new live window and the reference window as its
|
||
children. The chosen window's right edge coordinate would then equal
|
||
the left edge coordinate of the reference window. Its left edge
|
||
coordinate would equal the left edge coordinate of the frame's new
|
||
root window.
|
||
|
||
Four special values for @code{direction} entries allow implicitly
|
||
specifying the selected frame's main window as the reference window:
|
||
@code{leftmost}, @code{top}, @code{rightmost} and @code{bottom}. This
|
||
means that instead of, for example, @w{@code{(direction . left)
|
||
(window . main)}} one can just specify @w{@code{(direction
|
||
. leftmost)}}. An existing @code{window} @var{alist} entry is ignored
|
||
in such cases.
|
||
@end defun
|
||
|
||
@defun display-buffer-below-selected buffer alist
|
||
This function tries to display @var{buffer} in a window below the
|
||
selected window. If there is a window below the selected one and that
|
||
window already displays @var{buffer}, it reuses that window.
|
||
|
||
If there is no such window, this function tries to create a new window
|
||
by splitting the selected one, and displays @var{buffer} there. It will
|
||
also try to adjust that window's size provided @var{alist} contains a
|
||
suitable @code{window-height} or @code{window-width} entry, see above.
|
||
|
||
If splitting the selected window fails and there is a non-dedicated
|
||
window below the selected one showing some other buffer, this function
|
||
tries to use that window for showing @var{buffer}.
|
||
|
||
If @var{alist} contains a @code{window-min-height} entry, this
|
||
function ensures that the window used is or can become at least as
|
||
high as specified by that entry's value. Note that this is only a
|
||
guarantee. In order to actually resize the window used, @var{alist}
|
||
must also provide an appropriate @code{window-height} entry.
|
||
@end defun
|
||
|
||
@defun display-buffer-at-bottom buffer alist
|
||
This function tries to display @var{buffer} in a window at the bottom
|
||
of the selected frame.
|
||
|
||
This either tries to split the window at the bottom of the frame or
|
||
the frame's root window, or to reuse an existing window at the bottom
|
||
of the selected frame.
|
||
@end defun
|
||
|
||
@defun display-buffer-pop-up-frame buffer alist
|
||
This function creates a new frame, and displays the buffer in that
|
||
frame's window. It actually performs the frame creation by calling
|
||
the function specified in @code{pop-up-frame-function}
|
||
(@pxref{Choosing Window Options}). If @var{alist} contains a
|
||
@code{pop-up-frame-parameters} entry, the associated value is added to
|
||
the newly created frame's parameters.
|
||
@end defun
|
||
|
||
@defun display-buffer-full-frame buffer alist
|
||
This function displays the buffer on the current frame, deleting all
|
||
other windows so that it takes up the full frame.
|
||
@end defun
|
||
|
||
@defun display-buffer-in-child-frame buffer alist
|
||
This function tries to display @var{buffer} in a child frame
|
||
(@pxref{Child Frames}) of the selected frame, either reusing an
|
||
existing child frame or by making a new one. If @var{alist} has a
|
||
non-@code{nil} @code{child-frame-parameters} entry, the corresponding
|
||
value is an alist of frame parameters to give the new frame. A
|
||
@code{parent-frame} parameter specifying the selected frame is
|
||
provided by default. If the child frame should become the child of
|
||
another frame, a corresponding entry must be added to @var{alist}.
|
||
|
||
The appearance of child frames is largely dependent on the parameters
|
||
provided via @var{alist}. It is advisable to use at least ratios to
|
||
specify the size (@pxref{Size Parameters}) and the position
|
||
(@pxref{Position Parameters}) of the child frame, and to add a
|
||
@code{keep-ratio} parameter (@pxref{Frame Interaction Parameters}), in
|
||
order to make sure that the child frame remains visible. For other
|
||
parameters that should be considered see @ref{Child Frames}.
|
||
@end defun
|
||
|
||
@defun display-buffer-use-some-frame buffer alist
|
||
This function tries to display @var{buffer} by finding a frame that
|
||
meets a predicate (by default any frame other than the selected
|
||
frame).
|
||
|
||
If this function chooses a window on another frame, it makes that
|
||
frame visible and, unless @var{alist} contains an
|
||
@code{inhibit-switch-frame} entry, raises that frame if necessary.
|
||
|
||
If @var{alist} has a non-@code{nil} @code{frame-predicate} entry, its
|
||
value is a function taking one argument (a frame), returning
|
||
non-@code{nil} if the frame is a candidate; this function replaces the
|
||
default predicate.
|
||
|
||
If @var{alist} has a non-@code{nil} @code{inhibit-same-window} entry,
|
||
the selected window is not used; thus if the selected frame has a
|
||
single window, it is not used.
|
||
@end defun
|
||
|
||
@defun display-buffer-no-window buffer alist
|
||
If @var{alist} has a non-@code{nil} @code{allow-no-window} entry, then
|
||
this function does not display @var{buffer} and returns the symbol
|
||
@code{fail}. This constitutes the only exception to the convention
|
||
that an action function returns either @code{nil} or a window showing
|
||
@var{buffer}. If @var{alist} has no such @code{allow-no-window}
|
||
entry, this function returns @code{nil}.
|
||
|
||
If this function returns @code{fail}, @code{display-buffer} will skip
|
||
the execution of any further display actions and return @code{nil}
|
||
immediately. If this function returns @code{nil},
|
||
@code{display-buffer} will continue with the next display action, if
|
||
any.
|
||
|
||
It is assumed that when a caller of @code{display-buffer} specifies a
|
||
non-@code{nil} @code{allow-no-window} entry, it is also able to handle
|
||
a @code{nil} return value.
|
||
@end defun
|
||
|
||
Two other action functions are described in their proper
|
||
sections---@code{display-buffer-in-side-window} (@pxref{Displaying
|
||
Buffers in Side Windows}) and @code{display-buffer-in-atom-window}
|
||
(@pxref{Atomic Windows}).
|
||
|
||
|
||
@node Buffer Display Action Alists
|
||
@subsection Action Alists for Buffer Display
|
||
@cindex buffer display action alist
|
||
@cindex action alist for buffer display
|
||
|
||
An @dfn{action alist} is an association list mapping predefined
|
||
symbols recognized by action functions to values these functions are
|
||
supposed to interpret accordingly. In each call,
|
||
@code{display-buffer} constructs a new, possibly empty action alist
|
||
and passes that entire list on to any action function it calls.
|
||
|
||
By design, action functions are free in their interpretation of
|
||
action alist entries. In fact, some entries like
|
||
@code{allow-no-window} or @code{previous-window} have a meaning only
|
||
for one or a few action functions, and are ignored by the rest. Other
|
||
entries, like @code{inhibit-same-window} or @code{window-parameters},
|
||
are supposed to be respected by most action functions, including those
|
||
provided by application programs and external packages.
|
||
|
||
In the previous subsection we have described in detail how
|
||
individual action functions interpret the action alist entries they
|
||
care about. Here we give a reference list of all known action alist
|
||
entries according to their symbols, together with their values and
|
||
action functions (@pxref{Buffer Display Action Functions}) that
|
||
recognize them. Throughout this list, the terms ``buffer'' will refer
|
||
to the buffer @code{display-buffer} is supposed to display, and
|
||
``value'' refers to the entry's value.
|
||
|
||
@table @code
|
||
@vindex inhibit-same-window@r{, a buffer display action alist entry}
|
||
@item inhibit-same-window
|
||
If the value is non-@code{nil}, this signals that the selected window
|
||
must not be used for displaying the buffer. All action functions that
|
||
(re-)use an existing window should respect this entry.
|
||
|
||
@vindex previous-window@r{, a buffer display action alist entry}
|
||
@item previous-window
|
||
The value must specify a window that may have displayed the buffer
|
||
previously. @code{display-buffer-in-previous-window} will give
|
||
preference to such a window provided it is still live and not
|
||
dedicated to another buffer.
|
||
|
||
@vindex mode@r{, a buffer display action alist entry}
|
||
@item mode
|
||
The value is either a major mode or a list of major modes.
|
||
@code{display-buffer-reuse-mode-window} may reuse a window whenever
|
||
the value specified by this entry matches the major mode of that
|
||
window's buffer. Other action functions ignore such entries.
|
||
|
||
@vindex frame-predicate@r{, a buffer display action alist entry}
|
||
@item frame-predicate
|
||
The value must be a function taking one argument (a frame), supposed
|
||
to return non-@code{nil} if that frame is a candidate for displaying
|
||
the buffer. This entry is used by
|
||
@code{display-buffer-use-some-frame}.
|
||
|
||
@vindex reusable-frames@r{, a buffer display action alist entry}
|
||
@item reusable-frames
|
||
The value specifies the set of frames to search for a window that can
|
||
be reused because it already displays the buffer. It can be set as
|
||
follows:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
@code{nil} means consider only windows on the selected frame.
|
||
(Actually, the last frame used that is not a minibuffer-only frame.)
|
||
@item
|
||
@code{visible} means consider windows on all visible frames.
|
||
@item
|
||
0 means consider windows on all visible or iconified frames.
|
||
@item
|
||
A frame means consider windows on that frame only.
|
||
@item
|
||
@code{t} means consider windows on all frames. (Note that this value
|
||
is rarely the right thing to use---it might also return a tooltip frame.)
|
||
@end itemize
|
||
|
||
Note that the meaning of @code{nil} differs slightly from that of the
|
||
@var{all-frames} argument to @code{next-window} (@pxref{Cyclic Window
|
||
Ordering}).
|
||
|
||
A major client of this is @code{display-buffer-reuse-window}, but all
|
||
other action functions that try to reuse a window are affected as
|
||
well. @code{display-buffer-in-previous-window} consults it when
|
||
searching for a window that previously displayed the buffer on another
|
||
frame.
|
||
|
||
@vindex inhibit-switch-frame@r{, a buffer display action alist entry}
|
||
@item inhibit-switch-frame
|
||
A non-@code{nil} value prevents another frame from being raised or
|
||
selected, if the window chosen by @code{display-buffer} is displayed
|
||
there. Primarily affected by this are
|
||
@code{display-buffer-use-some-frame} and
|
||
@code{display-buffer-reuse-window}. Ideally,
|
||
@code{display-buffer-pop-up-frame} should be affected as well, but there
|
||
is no guarantee that the window manager will comply.
|
||
|
||
@vindex window-parameters@r{, a buffer display action alist entry}
|
||
@item window-parameters
|
||
The value specifies an alist of window parameters to give the chosen
|
||
window. All action functions that choose a window should process this
|
||
entry.
|
||
|
||
@vindex window-min-width@r{, a buffer display action alist entry}
|
||
@item window-min-width
|
||
The value specifies a minimum width of the window used, in canonical
|
||
frame columns. The special value @code{full-width} means the chosen
|
||
window should be one that has no other windows on the left or right of
|
||
it in its frame.
|
||
|
||
This entry is currently honored by @code{display-buffer-use-some-window}
|
||
and @code{display-buffer-use-least-recent-window}, which try hard to avoid
|
||
returning a less recently used window that does not satisfy the entry.
|
||
|
||
Note that providing such an entry alone does not necessarily make the
|
||
window as wide as specified by its value. To actually resize an
|
||
existing window or make a new window as wide as specified by this
|
||
entry's value, a @code{window-width} entry specifying that value
|
||
should be provided as well. Such a @code{window-width} entry can,
|
||
however, specify a completely different value, or ask the window width
|
||
to fit that of its buffer, in which case the
|
||
@code{window-min-width} entry provides the guaranteed minimum width of
|
||
the window.
|
||
|
||
@vindex window-min-height@r{, a buffer display action alist entry}
|
||
@item window-min-height
|
||
The value specifies a minimum height of the window used, in canonical
|
||
frame lines. The special value @code{full-height} means the chosen
|
||
window should be a full-height window, one that has no other windows
|
||
above or below it in its frame.
|
||
|
||
This entry is currently honored by @code{display-buffer-below-selected}
|
||
which does not use a window that is not as high as specified by this
|
||
entry. It's also honored by @code{display-buffer-use-some-window} and
|
||
@code{display-buffer-use-least-recent-window} which try hard to avoid
|
||
returning a less recently used window if it does not satisfy this
|
||
constraint.
|
||
|
||
Note that providing such an entry alone does not necessarily make the
|
||
window as tall as specified by its value. To actually resize an
|
||
existing window or make a new window as tall as specified by that
|
||
value, a @code{window-height} entry specifying that value should be
|
||
provided as well. Such a @code{window-height} entry can, however,
|
||
specify a completely different value or ask the window height to be
|
||
fit to that of its buffer in which case the @code{window-min-height}
|
||
entry provides the guaranteed minimum height of the window used.
|
||
|
||
@vindex window-height@r{, a buffer display action alist entry}
|
||
@item window-height
|
||
The value specifies whether and how to adjust the height of the chosen
|
||
window and can be one of the following:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
@code{nil} means to leave the height of the chosen window alone.
|
||
|
||
@item
|
||
An integer number specifies the desired total height of the chosen
|
||
window in lines.
|
||
|
||
@item
|
||
A floating-point number specifies the fraction of the chosen window's
|
||
desired total height with respect to the total height of its frame's
|
||
root window.
|
||
|
||
@item
|
||
A cons cell whose @sc{car} is @code{body-lines} and whose @sc{cdr} is an
|
||
integer that specifies the height of the chosen window's body in frame
|
||
lines.
|
||
|
||
@item
|
||
If the value specifies a function, that function is called with one
|
||
argument---the chosen window. The function is supposed to adjust the
|
||
height of the window; its return value is ignored. Suitable functions
|
||
are @code{fit-window-to-buffer} and
|
||
@code{shrink-window-if-larger-than-buffer}, see @ref{Resizing Windows}.
|
||
@end itemize
|
||
|
||
By convention, the height of the chosen window is adjusted only if the
|
||
window is part of a vertical combination (@pxref{Windows and Frames})
|
||
to avoid changing the height of other, unrelated windows. Also, this
|
||
entry should be processed only under certain conditions which are
|
||
specified right below this list.
|
||
|
||
@vindex window-width@r{, a buffer display action alist entry}
|
||
@item window-width
|
||
This entry is similar to the @code{window-height} entry described
|
||
before, but used to adjust the chosen window's width instead. The
|
||
value can be one of the following:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
@code{nil} means to leave the width of the chosen window alone.
|
||
|
||
@item
|
||
An integer specifies the desired total width of the chosen window in
|
||
columns.
|
||
|
||
@item
|
||
A floating-point number specifies the fraction of the chosen window's
|
||
desired total width with respect to the total width of the frame's
|
||
root window.
|
||
|
||
@item
|
||
A cons cell whose @sc{car} is @code{body-columns} and whose @sc{cdr} is
|
||
an integer that specifies the width of the chosen window's body in frame
|
||
columns.
|
||
|
||
@item
|
||
If the value specifies a function, that function is called with one
|
||
argument---the chosen window. The function is supposed to adjust the
|
||
width of the window; its return value is ignored.
|
||
@end itemize
|
||
|
||
@vindex window-size@r{, a buffer display action alist entry}
|
||
@item window-size
|
||
This entry is a combination of the two preceding ones and can be used to
|
||
adjust the chosen window's height @emph{and} width. Since windows can
|
||
be resized in one direction only without affecting other windows,
|
||
@code{window-size} is effective only to set up the size of a window
|
||
appearing alone on a frame. The value can be one of the following:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
@code{nil} means to leave the size of the chosen window alone.
|
||
|
||
@item
|
||
A cons cell of two integers specifies the desired total width and height
|
||
of the chosen window in lines and columns. It's effect is to adjust the
|
||
size of the frame accordingly.
|
||
|
||
@item
|
||
A cons cell whose @sc{car} equals @code{body-chars} and whose @sc{cdr}
|
||
is a cons cell of two integers---the desired body width and height of
|
||
the chosen window in frame columns and lines. It's effect is to adjust
|
||
the size of the frame accordingly.
|
||
|
||
@item
|
||
If the value specifies a function, that function is called with one
|
||
argument---the chosen window. The function is supposed to adjust the
|
||
size of the window's frame; its return value is ignored.
|
||
@end itemize
|
||
|
||
This entry should be processed under only certain conditions which are
|
||
specified right below this list.
|
||
|
||
@vindex dedicated@r{, a buffer display action alist entry}
|
||
@item dedicated
|
||
If non-@code{nil}, such an entry tells @code{display-buffer} to mark
|
||
any window it creates as dedicated to its buffer (@pxref{Dedicated
|
||
Windows}). It does that by calling @code{set-window-dedicated-p} with
|
||
the chosen window as first argument and the entry's value as second.
|
||
Side windows are by default dedicated with the value @code{side}
|
||
(@pxref{Side Window Options and Functions}).
|
||
|
||
@vindex preserve-size@r{, a buffer display action alist entry}
|
||
@item preserve-size
|
||
If non-@code{nil} such an entry tells Emacs to preserve the size of
|
||
the window chosen (@pxref{Preserving Window Sizes}). The value should
|
||
be either @w{@code{(t . nil)}} to preserve the width of the window,
|
||
@w{@code{(nil . t)}} to preserve its height or @w{@code{(t . t)}} to
|
||
preserve both, its width and its height. This entry should be
|
||
processed only under certain conditions which are specified right
|
||
after this list.
|
||
|
||
@vindex lru-frames@r{, a buffer display action alist entry}
|
||
@item lru-frames
|
||
The value specifies the set of frames to search for a window that can be
|
||
used to display the buffer. It is honored by
|
||
@code{display-buffer-use-some-window} and
|
||
@code{display-buffer-use-least-recent-window} when trying to find a less
|
||
recently used window showing some other buffer. Its values are the same
|
||
as for the @code{reusable-frames} entry described above.
|
||
|
||
@vindex lru-time@r{, a buffer display action alist entry}
|
||
@item lru-time
|
||
The value is supposed to specify a use time (@pxref{Selecting Windows}).
|
||
This entry is honored by @code{display-buffer-use-some-window} and
|
||
@code{display-buffer-use-least-recent-window} when trying to find a less
|
||
recently used window showing some other buffer. If a window's use time
|
||
is higher than the value specified by this option, these action
|
||
functions will not consider such a window for displaying the buffer.
|
||
|
||
@vindex bump-use-time@r{, a buffer display action alist entry}
|
||
@item bump-use-time
|
||
If non-@code{nil}, such an entry will cause @code{display-buffer} to
|
||
bump the use time (@pxref{Selecting Windows}) of the window it uses.
|
||
This should avoid later use of this window by action functions
|
||
like @code{display-buffer-use-some-window} and
|
||
@code{display-buffer-use-least-recent-window} for showing another
|
||
buffer.
|
||
|
||
There is a fine difference between using this entry and using the action
|
||
function @code{display-buffer-use-least-recent-window}. Calling the
|
||
latter means to only bump the use times of windows that function uses
|
||
for displaying the buffer. The entry described here will cause
|
||
@code{display-buffer} to bump the use time of @emph{any} window used for
|
||
displaying a buffer.
|
||
|
||
@vindex pop-up-frame-parameters@r{, a buffer display action alist entry}
|
||
@item pop-up-frame-parameters
|
||
The value specifies an alist of frame parameters to give a new frame,
|
||
if one is created. @code{display-buffer-pop-up-frame} is its one and
|
||
only addressee.
|
||
|
||
@vindex pop-up-frames@r{, a buffer display action alist entry}
|
||
@item pop-up-frames
|
||
The value controls whether @code{display-buffer} may display buffers by
|
||
making new frames. It has the same meaning as the @code{pop-up-frames}
|
||
variable and takes precedence over it when present. Its main intended
|
||
purpose is to override a non-@code{nil} value of the variable for
|
||
particular buffers which the user prefers to keep in the selected frame.
|
||
|
||
@vindex parent-frame@r{, a buffer display action alist entry}
|
||
@item parent-frame
|
||
The value specifies the parent frame to be used when the buffer is
|
||
displayed on a child frame. This entry is used only by
|
||
@code{display-buffer-in-child-frame}.
|
||
|
||
@vindex child-frame-parameters@r{, a buffer display action alist entry}
|
||
@item child-frame-parameters
|
||
The value specifies an alist of frame parameters to use when the buffer
|
||
is displayed on a child frame. This entry is used only by
|
||
@code{display-buffer-in-child-frame}.
|
||
|
||
@vindex side@r{, a buffer display action alist entry}
|
||
@item side
|
||
The value denotes the side of the frame or window where a new window
|
||
displaying the buffer shall be created. This entry is used by
|
||
@code{display-buffer-in-side-window} to indicate the side of the frame
|
||
where a new side window shall be placed (@pxref{Displaying Buffers in
|
||
Side Windows}). It is also used by
|
||
@code{display-buffer-in-atom-window} to indicate the side of an
|
||
existing window where the new window shall be located (@pxref{Atomic
|
||
Windows}).
|
||
|
||
@vindex slot@r{, a buffer display action alist entry}
|
||
@item slot
|
||
If non-@code{nil}, the value specifies the slot of the side window
|
||
supposed to display the buffer. This entry is used only by
|
||
@code{display-buffer-in-side-window}.
|
||
|
||
@vindex direction@r{, a buffer display action alist entry}
|
||
@item direction
|
||
The value specifies a direction which, together with a @code{window}
|
||
entry, allows @code{display-buffer-in-direction} to determine the
|
||
location of the window to display the buffer.
|
||
|
||
@vindex window@r{, a buffer display action alist entry}
|
||
@item window
|
||
The value specifies a window that is in some way related to the window
|
||
chosen by @code{display-buffer}. This entry is currently used by
|
||
@code{display-buffer-in-atom-window} to indicate the window on whose
|
||
side the new window shall be created. It is also used by
|
||
@code{display-buffer-in-direction} to specify the reference window on
|
||
whose side the resulting window shall appear.
|
||
|
||
@vindex allow-no-window@r{, a buffer display action alist entry}
|
||
@item allow-no-window
|
||
If the value is non-@code{nil}, @code{display-buffer} does not
|
||
necessarily have to display the buffer and the caller is prepared to
|
||
accept that. This entry is not intended for user customizations,
|
||
since there is no guarantee that an arbitrary caller of
|
||
@code{display-buffer} will be able to handle the case that no window
|
||
will display the buffer. @code{display-buffer-no-window} is the only
|
||
action function that cares about this entry.
|
||
|
||
@vindex some-window@r{, a buffer display action alist entry}
|
||
@item some-window
|
||
If the value is @code{nil} or @code{lru}, @code{display-buffer-use-some-window}
|
||
prefers the least recently used window while avoiding selecting windows
|
||
that are not full-width and windows on another frame. If the value is
|
||
@code{mru}, it prefers the most recently used window not considering the
|
||
selected window and windows on any frame but the selected one. If the
|
||
value is a function, it is called with two arguments: a buffer and an
|
||
alist, and should return the window where to display the buffer.
|
||
|
||
@vindex body-function@r{, a buffer display action alist entry}
|
||
@item body-function
|
||
The value must be a function taking one argument (a displayed window).
|
||
This function can be used to fill the displayed window's body with
|
||
some contents that might depend on dimensions of the displayed window.
|
||
It is called @emph{after} the buffer is displayed, and @emph{before}
|
||
the entries @code{window-height}, @code{window-width} and
|
||
@code{preserve-size} are applied that could resize the window to fit
|
||
it to the inserted contents.
|
||
|
||
@vindex post-command-select-window@r{, a buffer display action alist entry}
|
||
@item post-command-select-window
|
||
If the value is non-@code{nil}, the buffer displayed by @code{display-buffer}
|
||
is selected after the current command is executed by running the hook
|
||
@code{post-command-hook} (@pxref{Command Overview}).
|
||
If the value is @code{nil}, the buffer selected by such functions as
|
||
@code{pop-to-buffer} is deselected, and the window that was selected
|
||
before calling this function will remain selected regardless of which
|
||
windows were selected afterwards within this command.
|
||
|
||
@vindex category@r{, a buffer display action alist entry}
|
||
@item category
|
||
If the caller of @code{display-buffer} passes an alist entry
|
||
@code{(category . symbol)} in its @var{action} argument, then you can
|
||
match the displayed buffer by using the same category in the condition
|
||
part of @code{display-buffer-alist} entries.
|
||
@end table
|
||
|
||
By convention, the entries @code{window-height}, @code{window-width}
|
||
and @code{preserve-size} are applied after the chosen window's buffer
|
||
has been set up and if and only if that window never showed another
|
||
buffer before. More precisely, the latter means that the window must
|
||
have been either created by the current @code{display-buffer} call or
|
||
the window was created earlier by @code{display-buffer} to show the
|
||
buffer and never was used to show another buffer until it was reused
|
||
by the current invocation of @code{display-buffer}.
|
||
|
||
If no @code{window-height}, @code{window-width} or @code{window-size}
|
||
entry was specified, the window may still be resized automatically when
|
||
the buffer is temporary and @code{temp-buffer-resize-mode} has been
|
||
enabled, @ref{Temporary Displays}. In that case, the @sc{cdr} of a
|
||
@code{window-height}, @code{window-width} or @code{window-size} entry
|
||
can be used to inhibit or override the default behavior of
|
||
@code{temp-buffer-resize-mode} for specific buffers or invocations of
|
||
@code{display-buffer}.
|
||
|
||
@node Choosing Window Options
|
||
@subsection Additional Options for Displaying Buffers
|
||
|
||
The behavior of buffer display actions (@pxref{Choosing Window}) can
|
||
be further modified by the following user options.
|
||
|
||
@defopt pop-up-windows
|
||
If the value of this variable is non-@code{nil}, @code{display-buffer}
|
||
is allowed to split an existing window to make a new window for
|
||
displaying in. This is the default.
|
||
|
||
This variable is provided for backward compatibility only. It is
|
||
obeyed by @code{display-buffer} via a special mechanism in
|
||
@code{display-buffer-fallback-action}, which calls the action function
|
||
@code{display-buffer-pop-up-window} (@pxref{Buffer Display Action
|
||
Functions}) when the value of this option is non-@code{nil}. It is
|
||
not consulted by @code{display-buffer-pop-up-window} itself, which the
|
||
user may specify directly in @code{display-buffer-alist} etc.
|
||
@end defopt
|
||
|
||
@defopt split-window-preferred-function
|
||
This variable specifies a function for splitting a window, in order to
|
||
make a new window for displaying a buffer. It is used by the
|
||
@code{display-buffer-pop-up-window} action function to actually split
|
||
the window.
|
||
|
||
The value must be a function that takes one argument, a window, and
|
||
returns either a new window (which will be used to display the desired
|
||
buffer) or @code{nil} (which means the splitting failed). The default
|
||
value is @code{split-window-sensibly}, which is documented next.
|
||
@end defopt
|
||
|
||
@defun split-window-sensibly &optional window
|
||
This function tries to split @var{window} and return the newly created
|
||
window. If @var{window} cannot be split, it returns @code{nil}. If
|
||
@var{window} is omitted or @code{nil}, it defaults to the selected
|
||
window.
|
||
|
||
This function obeys the usual rules that determine when a window may
|
||
be split (@pxref{Splitting Windows}). It first tries to split by
|
||
placing the new window below, subject to the restriction imposed by
|
||
@code{split-height-threshold} (see below), in addition to any other
|
||
restrictions. If that fails, it tries to split by placing the new
|
||
window to the right, subject to @code{split-width-threshold} (see
|
||
below). If that also fails, and the window is the only window on its
|
||
frame, this function again tries to split and place the new window
|
||
below, disregarding @code{split-height-threshold}. If this fails as
|
||
well, this function gives up and returns @code{nil}.
|
||
@end defun
|
||
|
||
@defopt split-height-threshold
|
||
This variable specifies whether @code{split-window-sensibly} is
|
||
allowed to split the window placing the new window below. If it is an
|
||
integer, that means to split only if the original window has at least
|
||
that many lines. If it is @code{nil}, that means not to split this
|
||
way.
|
||
@end defopt
|
||
|
||
@defopt split-width-threshold
|
||
This variable specifies whether @code{split-window-sensibly} is
|
||
allowed to split the window placing the new window to the right. If
|
||
the value is an integer, that means to split only if the original
|
||
window has at least that many columns. If the value is @code{nil},
|
||
that means not to split this way.
|
||
@end defopt
|
||
|
||
@defopt even-window-sizes
|
||
This variable, if non-@code{nil}, causes @code{display-buffer} to even
|
||
window sizes whenever it reuses an existing window, and that window is
|
||
adjacent to the selected one.
|
||
|
||
If its value is @code{width-only}, sizes are evened only if the reused
|
||
window is on the left or right of the selected one and the selected
|
||
window is wider than the reused one. If its value is @code{height-only}
|
||
sizes are evened only if the reused window is above or beneath the
|
||
selected window and the selected window is higher than the reused one.
|
||
Any other non-@code{nil} value means to even sizes in any of these cases
|
||
provided the selected window is larger than the reused one in the sense
|
||
of their combination.
|
||
@end defopt
|
||
|
||
@defopt pop-up-frames
|
||
If the value of this variable is non-@code{nil}, that means
|
||
@code{display-buffer} may display buffers by making new frames. The
|
||
default is @code{nil}.
|
||
|
||
A non-@code{nil} value also means that when @code{display-buffer} is
|
||
looking for a window already displaying @var{buffer-or-name}, it can
|
||
search any visible or iconified frame, not just the selected frame.
|
||
|
||
An entry by the same name in @code{display-buffer}'s @var{alist}
|
||
takes precedence over the variable.
|
||
|
||
This variable is provided mainly for backward compatibility. It is
|
||
obeyed by @code{display-buffer} via a special mechanism in
|
||
@code{display-buffer-fallback-action}, which calls the action function
|
||
@code{display-buffer-pop-up-frame} (@pxref{Buffer Display Action
|
||
Functions}) if the value is non-@code{nil}. (This is done before
|
||
attempting to split a window.) This variable is not consulted by
|
||
@code{display-buffer-pop-up-frame} itself, which the user may specify
|
||
directly in @code{display-buffer-alist} etc.
|
||
@end defopt
|
||
|
||
@defopt pop-up-frame-function
|
||
This variable specifies a function for creating a new frame, in order
|
||
to make a new window for displaying a buffer. It is used by the
|
||
@code{display-buffer-pop-up-frame} action function.
|
||
|
||
The value should be a function that takes no arguments and returns a
|
||
frame, or @code{nil} if no frame could be created. The default value
|
||
is a function that creates a frame using the parameters specified by
|
||
@code{pop-up-frame-alist} (see below).
|
||
@end defopt
|
||
|
||
@defopt pop-up-frame-alist
|
||
This variable holds an alist of frame parameters (@pxref{Frame
|
||
Parameters}), which is used by the function specified by
|
||
@code{pop-up-frame-function} to make a new frame. The default is
|
||
@code{nil}.
|
||
|
||
This option is provided for backward compatibility only. Note, that
|
||
when @code{display-buffer-pop-up-frame} calls the function specified
|
||
by @code{pop-up-frame-function}, it prepends the value of all
|
||
@code{pop-up-frame-parameters} action alist entries to
|
||
@code{pop-up-frame-alist} so that the values specified by the action
|
||
alist entry effectively override any corresponding values of
|
||
@code{pop-up-frame-alist}.
|
||
|
||
Hence, users should set up a @code{pop-up-frame-parameters} action
|
||
alist entry in @code{display-buffer-alist} instead of customizing
|
||
@code{pop-up-frame-alist}. Only this will guarantee that the value of
|
||
a parameter specified by the user overrides the value of that
|
||
parameter specified by the caller of @code{display-buffer}.
|
||
@end defopt
|
||
|
||
Many efforts in the design of @code{display-buffer} have been given
|
||
to maintain compatibility with code that uses older options like
|
||
@code{pop-up-windows}, @code{pop-up-frames},
|
||
@code{pop-up-frame-alist}, @code{same-window-buffer-names} and
|
||
@code{same-window-regexps}. Lisp Programs and users should refrain
|
||
from using these options. Above we already warned against customizing
|
||
@code{pop-up-frame-alist}. Here we describe how to convert the
|
||
remaining options to use display actions instead.
|
||
|
||
@table @code
|
||
@item pop-up-windows
|
||
@vindex pop-up-windows@r{, replacement for}
|
||
This variable is @code{t} by default. Instead of customizing it to
|
||
@code{nil} and thus telling @code{display-buffer} what not to do, it's
|
||
much better to list in @code{display-buffer-base-action} the action
|
||
functions it should try instead as, for example:
|
||
|
||
@example
|
||
@group
|
||
(setopt
|
||
display-buffer-base-action
|
||
'((display-buffer-reuse-window display-buffer-same-window
|
||
display-buffer-in-previous-window
|
||
display-buffer-use-some-window)))
|
||
@end group
|
||
@end example
|
||
|
||
@item pop-up-frames
|
||
@vindex pop-up-frames@r{, replacement for}
|
||
Instead of customizing this variable to @code{t}, you can customize
|
||
@code{display-buffer-base-action}, for example, as follows:
|
||
|
||
@example
|
||
@group
|
||
(setopt display-buffer-base-action '(nil (pop-up-frames . t)))
|
||
@end group
|
||
@end example
|
||
|
||
@item same-window-buffer-names
|
||
@itemx same-window-regexps
|
||
@vindex same-window-buffer-names@r{, replacement for}
|
||
@vindex same-window-regexps@r{, replacement for}
|
||
Instead of adding a buffer name or a regular expression to one of
|
||
these options use a @code{display-buffer-alist} entry for that buffer
|
||
specifying the action function @code{display-buffer-same-window}.
|
||
|
||
@example
|
||
@group
|
||
(setopt
|
||
display-buffer-alist
|
||
(cons '("\\*foo\\*" (display-buffer-same-window))
|
||
display-buffer-alist))
|
||
@end group
|
||
@end example
|
||
@end table
|
||
|
||
|
||
@node Precedence of Action Functions
|
||
@subsection Precedence of Action Functions
|
||
@cindex precedence of buffer display action functions
|
||
@cindex execution order of buffer display action functions
|
||
@cindex buffer display action functions, precedence
|
||
|
||
From the past subsections we already know that @code{display-buffer}
|
||
must be supplied with a number of display actions (@pxref{Choosing
|
||
Window}) in order to display a buffer. In a completely uncustomized
|
||
Emacs, these actions are specified by
|
||
@code{display-buffer-fallback-action} in the following order of
|
||
precedence: Reuse a window, pop up a new window on the same frame, use
|
||
a window previously showing the buffer, use some window and pop up a
|
||
new frame. (Note that the remaining actions named by
|
||
@code{display-buffer-fallback-action} are void in an uncustomized
|
||
Emacs).
|
||
|
||
Consider the following form:
|
||
|
||
@example
|
||
(display-buffer (get-buffer-create "*foo*"))
|
||
@end example
|
||
|
||
@noindent
|
||
Evaluating this form in the buffer @file{*scratch*} of an uncustomized
|
||
Emacs session will usually fail to reuse a window that shows
|
||
@file{*foo*} already, but succeed in popping up a new window.
|
||
Evaluating the same form again will now not cause any visible
|
||
changes---@code{display-buffer} reused the window already showing
|
||
@file{*foo*} because that action was applicable and had the highest
|
||
precedence among all applicable actions.
|
||
|
||
Popping up a new window will fail if there is not enough space on
|
||
the selected frame. In an uncustomized Emacs it typically fails when
|
||
there are already two windows on a frame. For example, if you now
|
||
type @w{@kbd{C-x 1}} followed by @w{@kbd{C-x 2}} and evaluate the form
|
||
once more, @file{*foo*} should show up in the lower
|
||
window---@code{display-buffer} just used ``some'' window. If, before
|
||
typing @w{@kbd{C-x 2}} you had typed @w{@kbd{C-x o}}, @file{*foo*}
|
||
would have been shown in the upper window because ``some'' window
|
||
stands for the ``least recently used'' window and the selected window
|
||
has been least recently used if and only if it is alone on its frame.
|
||
|
||
Let's assume you did not type @w{@kbd{C-x o}} and @file{*foo*} is
|
||
shown in the lower window. Type @w{@kbd{C-x o}} to get there followed
|
||
by @w{@kbd{C-x left}} and evaluate the form again. This should
|
||
display @file{*foo*} in the same, lower window because that window had
|
||
already shown @file{*foo*} previously and was therefore chosen instead
|
||
of some other window.
|
||
|
||
So far we have only observed the default behavior in an uncustomized
|
||
Emacs session. To see how this behavior can be customized, let's
|
||
consider the option @code{display-buffer-base-action}. It provides a
|
||
very coarse customization which conceptually affects the display of
|
||
@emph{any} buffer. It can be used to supplement the actions supplied
|
||
by @code{display-buffer-fallback-action} by reordering them or by
|
||
adding actions that are not present there but fit more closely the
|
||
user's editing practice. However, it can also be used to change the
|
||
default behavior in a more profound way.
|
||
|
||
Let's consider a user who, as a rule, prefers to display buffers on
|
||
another frame. Such a user might provide the following customization:
|
||
|
||
@example
|
||
@group
|
||
(setopt
|
||
display-buffer-base-action
|
||
'((display-buffer-reuse-window display-buffer-pop-up-frame)
|
||
(reusable-frames . 0)))
|
||
@end group
|
||
@end example
|
||
|
||
@noindent
|
||
This setting will cause @code{display-buffer} to first try to find a
|
||
window showing the buffer on a visible or iconified frame and, if no
|
||
such frame exists, pop up a new frame. You can observe this behavior
|
||
on a graphical system by typing @w{@kbd{C-x 1}} in the window showing
|
||
@file{*scratch*} and evaluating our canonical @code{display-buffer}
|
||
form. This will usually create (and give focus to) a new frame whose
|
||
root window shows @file{*foo*}. Iconify that frame and evaluate the
|
||
canonical form again: @code{display-buffer} will reuse the window on
|
||
the new frame (usually raising the frame and giving it focus too).
|
||
|
||
Only if creating a new frame fails, @code{display-buffer} will
|
||
apply the actions supplied by @code{display-buffer-fallback-action}
|
||
which means to again try reusing a window, popping up a new window and
|
||
so on. A trivial way to make frame creation fail is supplied by the
|
||
following form:
|
||
|
||
@example
|
||
@group
|
||
(let ((pop-up-frame-function 'ignore))
|
||
(display-buffer (get-buffer-create "*foo*")))
|
||
@end group
|
||
@end example
|
||
|
||
@noindent
|
||
We will forget about that form immediately after observing that it
|
||
fails to create a new frame and uses a fallback action instead.
|
||
|
||
Note that @code{display-buffer-reuse-window} appears redundant in
|
||
the customization of @code{display-buffer-base-action} because it is
|
||
already part of @code{display-buffer-fallback-action} and should be
|
||
tried there anyway. However, that would fail because due to the
|
||
precedence of @code{display-buffer-base-action} over
|
||
@code{display-buffer-fallback-action}, at that time
|
||
@code{display-buffer-pop-up-frame} would have already won the race.
|
||
In fact, this:
|
||
|
||
@example
|
||
@group
|
||
(setopt
|
||
display-buffer-base-action
|
||
'(display-buffer-pop-up-frame (reusable-frames . 0)))
|
||
@end group
|
||
@end example
|
||
|
||
@noindent
|
||
would cause @code{display-buffer} to @emph{always} pop up a new frame
|
||
which is probably not what our user wants.
|
||
|
||
So far, we have only shown how @emph{users} can customize the
|
||
default behavior of @code{display-buffer}. Let us now see how
|
||
@emph{applications} can change the course of @code{display-buffer}.
|
||
The canonical way to do that is to use the @var{action} argument of
|
||
@code{display-buffer} or a function that calls it, like, for example,
|
||
@code{pop-to-buffer} (@pxref{Switching Buffers}).
|
||
|
||
Suppose an application wants to display @file{*foo*} preferably
|
||
below the selected window (to immediately attract the attention of the
|
||
user to the new window) or, if that fails, in a window at the bottom
|
||
of the frame. It could do that with a call like this:
|
||
|
||
@example
|
||
@group
|
||
(display-buffer
|
||
(get-buffer-create "*foo*")
|
||
'((display-buffer-below-selected display-buffer-at-bottom)))
|
||
@end group
|
||
@end example
|
||
|
||
@noindent
|
||
In order to see how this new, modified form works, delete any frame
|
||
showing @file{*foo*}, type @w{@kbd{C-x 1}} followed by @w{@kbd{C-x 2}} in the
|
||
window showing @file{*scratch*}, and subsequently evaluate that form.
|
||
@code{display-buffer} should split the upper window, and show
|
||
@file{*foo*} in the new window. Alternatively, if after @w{@kbd{C-x 2}}
|
||
you had typed @w{@kbd{C-x o}}, @code{display-buffer} would have split the
|
||
window at the bottom instead.
|
||
|
||
Suppose now that, before evaluating the new form, you have made the
|
||
selected window as small as possible, for example, by evaluating the
|
||
form @code{(fit-window-to-buffer)} in that window. In that case,
|
||
@code{display-buffer} would have failed to split the selected window
|
||
and would have split the frame's root window instead, effectively
|
||
displaying @file{*foo*} at the bottom of the frame.
|
||
|
||
In either case, evaluating the new form a second time should reuse
|
||
the window already showing @file{*foo*} since both functions supplied
|
||
by the @var{action} argument try to reuse such a window first.
|
||
|
||
By setting the @var{action} argument, an application effectively
|
||
overrules any customization of @code{display-buffer-base-action}. Our
|
||
user can now either accept the choice of the application, or redouble
|
||
by customizing the option @code{display-buffer-alist} as follows:
|
||
|
||
@example
|
||
@group
|
||
(setopt
|
||
display-buffer-alist
|
||
'(("\\*foo\\*"
|
||
(display-buffer-reuse-window display-buffer-pop-up-frame))))
|
||
@end group
|
||
@end example
|
||
|
||
@noindent
|
||
Trying this with the new, modified form above in a configuration that
|
||
does not show @file{*foo*} anywhere, will display @file{*foo*} on a
|
||
separate frame, completely ignoring the @var{action} argument of
|
||
@code{display-buffer}.
|
||
|
||
Note that we didn't care to specify a @code{reusable-frames} action
|
||
alist entry in our specification of @code{display-buffer-alist}.
|
||
@code{display-buffer} always takes the first one it finds---in our
|
||
case the one specified by @code{display-buffer-base-action}. If we
|
||
wanted to use a different specification, for example, to exclude
|
||
iconified frames showing @file{*foo*} from the list of reusable ones,
|
||
we would have to specify that separately, however:
|
||
|
||
@example
|
||
@group
|
||
(setopt
|
||
display-buffer-alist
|
||
'(("\\*foo\\*"
|
||
(display-buffer-reuse-window display-buffer-pop-up-frame)
|
||
(reusable-frames . visible))))
|
||
@end group
|
||
@end example
|
||
|
||
@noindent
|
||
If you try this, you will notice that repeated attempts to display
|
||
@file{*foo*} will succeed to reuse a frame only if that frame is
|
||
visible.
|
||
|
||
The above example would allow the conclusion that users customize
|
||
@code{display-buffer-alist} for the sole purpose to overrule the
|
||
@var{action} argument chosen by applications. Such a conclusion would
|
||
be incorrect. @code{display-buffer-alist} is the standard option for
|
||
users to direct the course of display of specific buffers in a
|
||
preferred way regardless of whether the display is also guided by an
|
||
@var{action} argument.
|
||
|
||
We can, however, reasonably conclude that customizing
|
||
@code{display-buffer-alist} differs from customizing
|
||
@code{display-buffer-base-action} in two major aspects: it is stronger
|
||
because it overrides the @var{action} argument of
|
||
@code{display-buffer}, and it enables you to explicitly specify the
|
||
affected buffers. In fact, displaying other buffers is not affected
|
||
in any way by a customization for @file{*foo*}. For example,
|
||
|
||
@example
|
||
(display-buffer (get-buffer-create "*bar*"))
|
||
@end example
|
||
|
||
@noindent
|
||
continues being governed by the settings of
|
||
@code{display-buffer-base-action} and
|
||
@code{display-buffer-fallback-action} only.
|
||
|
||
We could stop with our examples here but Lisp programs still have
|
||
an ace up their sleeves which they can use to overrule any
|
||
customization of @code{display-buffer-alist}. It's the variable
|
||
@code{display-buffer-overriding-action} which they can bind around
|
||
@code{display-buffer} calls as follows:
|
||
|
||
@example
|
||
@group
|
||
(let ((display-buffer-overriding-action
|
||
'((display-buffer-same-window))))
|
||
(display-buffer
|
||
(get-buffer-create "*foo*")
|
||
'((display-buffer-below-selected display-buffer-at-bottom))))
|
||
@end group
|
||
@end example
|
||
|
||
@noindent
|
||
Evaluating this form will usually display @file{*foo*} in the selected
|
||
window regardless of the @var{action} argument and any user
|
||
customizations. (Usually, an application will not bother to also
|
||
provide an @var{action} argument. Here it just serves to illustrate
|
||
the fact that it gets overridden.)
|
||
|
||
It might be illustrative to look at the list of action functions
|
||
@code{display-buffer} would have tried to display @file{*foo*} with
|
||
the customizations we provided here. The list (including comments
|
||
explaining who added this and the subsequent elements) is:
|
||
|
||
@example
|
||
@group
|
||
(display-buffer-same-window ;; `display-buffer-overriding-action'
|
||
display-buffer-reuse-window ;; `display-buffer-alist'
|
||
display-buffer-pop-up-frame
|
||
display-buffer-below-selected ;; ACTION argument
|
||
display-buffer-at-bottom
|
||
display-buffer-reuse-window ;; `display-buffer-base-action'
|
||
display-buffer-pop-up-frame
|
||
display-buffer--maybe-same-window ;; `display-buffer-fallback-action'
|
||
display-buffer-reuse-window
|
||
display-buffer--maybe-pop-up-frame-or-window
|
||
display-buffer-in-previous-window
|
||
display-buffer-use-some-window
|
||
display-buffer-pop-up-frame)
|
||
@end group
|
||
@end example
|
||
|
||
@noindent
|
||
Note that among the internal functions listed here,
|
||
@code{display-buffer--maybe-same-window} is effectively ignored while
|
||
@code{display-buffer--maybe-pop-up-frame-or-window} actually runs
|
||
@code{display-buffer-pop-up-window}.
|
||
|
||
The action alist passed in each function call is:
|
||
|
||
@example
|
||
@group
|
||
((reusable-frames . visible)
|
||
(reusable-frames . 0))
|
||
@end group
|
||
@end example
|
||
|
||
@noindent
|
||
which shows that we have used the second specification of
|
||
@code{display-buffer-alist} above, overriding the specification
|
||
supplied by @code{display-buffer-base-action}. Suppose our user had
|
||
written that as
|
||
|
||
@example
|
||
@group
|
||
(setopt
|
||
display-buffer-alist
|
||
'(("\\*foo\\*"
|
||
(display-buffer-reuse-window display-buffer-pop-up-frame)
|
||
(inhibit-same-window . t)
|
||
(reusable-frames . visible))))
|
||
@end group
|
||
@end example
|
||
|
||
@noindent
|
||
In this case the @code{inhibit-same-window} alist entry will
|
||
successfully invalidate the @code{display-buffer-same-window}
|
||
specification from @code{display-buffer-overriding-action} and
|
||
@code{display-buffer} will show @file{*foo*} on another frame. To
|
||
make @code{display-buffer-overriding-action} more robust in this
|
||
regard, the application would have to specify an appropriate
|
||
@code{inhibit-same-window} entry too, for example, as follows:
|
||
|
||
@example
|
||
@group
|
||
(let ((display-buffer-overriding-action
|
||
'(display-buffer-same-window (inhibit-same-window . nil))))
|
||
(display-buffer (get-buffer-create "*foo*")))
|
||
@end group
|
||
@end example
|
||
|
||
@noindent
|
||
This last example shows that while the precedence order of action
|
||
functions is fixed, as described in @ref{Choosing Window}, an action
|
||
alist entry specified by a display action ranked lower in that order
|
||
can affect the execution of a higher ranked display action.
|
||
|
||
|
||
@node The Zen of Buffer Display
|
||
@subsection The Zen of Buffer Display
|
||
@cindex guidelines for buffer display
|
||
@cindex writing buffer display actions
|
||
@cindex buffer display conventions
|
||
|
||
In its most simplistic form, a frame accommodates always one single
|
||
window that can be used for displaying a buffer. As a consequence, it
|
||
is always the latest call of @code{display-buffer} that will have
|
||
succeeded in placing its buffer there.
|
||
|
||
Since working with such a frame is not very practical, Emacs by
|
||
default allows for more complex frame layouts controlled by the
|
||
default values of the frame size and the @code{split-height-threshold}
|
||
and @code{split-width-threshold} options. Displaying a buffer not yet
|
||
shown on a frame then either splits the single window on that frame or
|
||
(re-)uses one of its two windows.
|
||
|
||
The default behavior is abandoned as soon as the user customizes
|
||
one of these thresholds or manually changes the frame's layout. The
|
||
default behavior is also abandoned when calling @code{display-buffer}
|
||
with a non-@code{nil} @var{action} argument or the user customizes one
|
||
of the options mentioned in the previous subsections. Mastering
|
||
@code{display-buffer} soon may become a frustrating experience due to
|
||
the plethora of applicable display actions and the resulting frame
|
||
layouts.
|
||
|
||
However, refraining from using buffer display functions and falling
|
||
back on a split & delete windows metaphor is not a good idea either.
|
||
Buffer display functions give Lisp programs and users a framework to
|
||
reconcile their different needs; no comparable framework exists for
|
||
splitting and deleting windows. Buffer display functions also allow
|
||
to at least partially restore the layout of a frame when removing a
|
||
buffer from it later (@pxref{Quitting Windows}).
|
||
|
||
Below we will give a number of guidelines to redeem the frustration
|
||
mentioned above and thus to avoid literally losing buffers in-between
|
||
the windows of a frame.
|
||
|
||
@table @asis
|
||
@item Write display actions without stress
|
||
Writing display actions can be a pain because one has to lump together
|
||
action functions and action alists in one huge list. (Historical
|
||
reasons prevented us from having @code{display-buffer} support
|
||
separate arguments for these.) It might help to memorize some basic
|
||
forms like the ones listed below:
|
||
|
||
@example
|
||
'(nil (inhibit-same-window . t))
|
||
@end example
|
||
|
||
@noindent
|
||
specifies an action alist entry only and no action function. Its sole
|
||
purpose is to inhibit a @code{display-buffer-same-window} function
|
||
specified elsewhere from showing the buffer in the same window, see
|
||
also the last example of the preceding subsection.
|
||
|
||
@example
|
||
'(display-buffer-below-selected)
|
||
@end example
|
||
|
||
@noindent
|
||
on the other hand, specifies one action function and an empty action
|
||
alist. To combine the effects of the above two specifications one
|
||
would write the form
|
||
|
||
@example
|
||
'(display-buffer-below-selected (inhibit-same-window . t))
|
||
@end example
|
||
|
||
@noindent
|
||
to add another action function one would write
|
||
|
||
@example
|
||
@group
|
||
'((display-buffer-below-selected display-buffer-at-bottom)
|
||
(inhibit-same-window . t))
|
||
@end group
|
||
@end example
|
||
|
||
@noindent
|
||
and to add another alist entry one would write
|
||
|
||
@example
|
||
@group
|
||
'((display-buffer-below-selected display-buffer-at-bottom)
|
||
(inhibit-same-window . t)
|
||
(window-height . fit-window-to-buffer))
|
||
@end group
|
||
@end example
|
||
|
||
@noindent
|
||
That last form can be used as @var{action} argument of
|
||
@code{display-buffer} in the following way:
|
||
|
||
@example
|
||
@group
|
||
(display-buffer
|
||
(get-buffer-create "*foo*")
|
||
'((display-buffer-below-selected display-buffer-at-bottom)
|
||
(inhibit-same-window . t)
|
||
(window-height . fit-window-to-buffer)))
|
||
@end group
|
||
@end example
|
||
|
||
@noindent
|
||
In a customization of @code{display-buffer-alist} it would be used as
|
||
follows:
|
||
|
||
@example
|
||
@group
|
||
(setopt
|
||
display-buffer-alist
|
||
'(("\\*foo\\*"
|
||
(display-buffer-below-selected display-buffer-at-bottom)
|
||
(inhibit-same-window . t)
|
||
(window-height . fit-window-to-buffer))))
|
||
@end group
|
||
@end example
|
||
|
||
@noindent
|
||
To add a customization for a second buffer one would then write:
|
||
|
||
@example
|
||
@group
|
||
(setopt
|
||
display-buffer-alist
|
||
'(("\\*foo\\*"
|
||
(display-buffer-below-selected display-buffer-at-bottom)
|
||
(inhibit-same-window . t)
|
||
(window-height . fit-window-to-buffer))
|
||
("\\*bar\\*"
|
||
(display-buffer-reuse-window display-buffer-pop-up-frame)
|
||
(reusable-frames . visible))))
|
||
@end group
|
||
@end example
|
||
|
||
@item Treat each other with respect
|
||
@code{display-buffer-alist} and @code{display-buffer-base-action} are
|
||
user options---Lisp programs must never set or rebind them.
|
||
@code{display-buffer-overriding-action}, on the other hand, is
|
||
reserved for applications---who seldom use that option and if they use
|
||
it, then with utmost care.
|
||
|
||
Older implementations of @code{display-buffer} frequently caused
|
||
users and applications to fight over the settings of user options like
|
||
@code{pop-up-frames} and @code{pop-up-windows} (@pxref{Choosing Window
|
||
Options}). This was one major reason for redesigning
|
||
@code{display-buffer}---to provide a clear framework specifying what
|
||
users and applications should be allowed to do.
|
||
|
||
Lisp programs must be prepared that user customizations may
|
||
cause buffers to get displayed in an unexpected way. They should
|
||
never assume in their subsequent behavior, that the buffer has been
|
||
shown precisely the way they asked for in the @var{action} argument of
|
||
@code{display-buffer}.
|
||
|
||
Users should not pose too many and too severe restrictions on how
|
||
arbitrary buffers get displayed. Otherwise, they will risk to lose
|
||
the characteristics of showing a buffer for a certain purpose.
|
||
Suppose a Lisp program has been written to compare different versions
|
||
of a buffer in two windows side-by-side. If the customization of
|
||
@code{display-buffer-alist} prescribes that any such buffer should be
|
||
always shown in or below the selected window, the program will have a
|
||
hard time to set up the desired window configuration via
|
||
@code{display-buffer}.
|
||
|
||
To specify a preference for showing an arbitrary buffer, users
|
||
should customize @code{display-buffer-base-action}. An example of how
|
||
users who prefer working with multiple frames would do that was given
|
||
in the previous subsection. @code{display-buffer-alist} should be
|
||
reserved for displaying specific buffers in a specific way.
|
||
|
||
@item Consider reusing a window that already shows the buffer
|
||
Generally, it's always a good idea for users and Lisp
|
||
programmers to be prepared for the case that a window already shows
|
||
the buffer in question and to reuse that window. In the preceding
|
||
subsection we have shown that failing to do so properly may cause
|
||
@code{display-buffer} to continuously pop up a new frame although a
|
||
frame showing that buffer existed already. In a few cases only, it
|
||
might be undesirable to reuse a window, for example, when a different
|
||
portion of the buffer should be shown in that window.
|
||
|
||
Hence, @code{display-buffer-reuse-window} is one action function
|
||
that should be used as often as possible, both in @var{action}
|
||
arguments and customizations. An @code{inhibit-same-window} entry in
|
||
the @var{action} argument usually takes care of the most common case
|
||
where reusing a window showing the buffer should be avoided---that
|
||
where the window in question is the selected one.
|
||
|
||
@item Attract focus to the window chosen
|
||
This is a no-brainer for people working with multiple frames---the
|
||
frame showing the buffer will automatically raise and get focus unless
|
||
an @code{inhibit-switch-frame} entry forbids it. For single frame
|
||
users this task can be considerably more difficult. In particular,
|
||
@code{display-buffer-pop-up-window} and
|
||
@code{display-buffer-use-some-window} can become obtrusive in this
|
||
regard. They split or use a seemingly arbitrary (often the largest or
|
||
least recently used) window, distracting the user's attention.
|
||
|
||
Some Lisp programs therefore try to choose a window at the bottom of
|
||
the frame, for example, in order to display the buffer in vicinity of
|
||
the minibuffer window where the user is expected to answer a question
|
||
related to the new window. For non-input related actions
|
||
@code{display-buffer-below-selected} might be preferable because the
|
||
selected window usually already has the user's attention.
|
||
|
||
@item Take care which window is selected
|
||
Many applications call @code{display-buffer} from within window
|
||
excursions produced by @code{with-selected-window} or
|
||
@code{select-window} calls with a non-@code{nil} @var{norecord}
|
||
argument. This is almost always a bad idea because the window selected
|
||
within such an excursion is usually not the window selected in the
|
||
configuration presented to the user.
|
||
|
||
If, for example, a user had added an @code{inhibit-same-window} alist
|
||
entry, that entry would have avoided the window selected within the
|
||
scope of the excursion and not the window selected in the resulting
|
||
configuration. Even if no such entry has been added, the resulting
|
||
behavior might be strange. While in a frame containing one live
|
||
window, evaluating the following form
|
||
|
||
@example
|
||
@group
|
||
(progn
|
||
(split-window)
|
||
(display-buffer "*Messages*"))
|
||
@end group
|
||
@end example
|
||
|
||
@noindent
|
||
will display a window showing the @file{*Messages*} buffer at the bottom
|
||
and leave the other window selected. Evaluating the next form
|
||
|
||
@example
|
||
@group
|
||
(with-selected-window (split-window)
|
||
(display-buffer "*Messages*"))
|
||
@end group
|
||
@end example
|
||
|
||
@noindent
|
||
will display @file{*Messages*} in a window on the top and select it
|
||
which is usually not what @code{display-buffer} is supposed to do.
|
||
|
||
On the other hand, while evaluating the following form
|
||
|
||
@example
|
||
@group
|
||
(progn
|
||
(split-window)
|
||
(pop-to-buffer "*Messages*"))
|
||
@end group
|
||
@end example
|
||
|
||
@noindent
|
||
will correctly select the @file{*Messages*} buffer, the next form
|
||
|
||
@example
|
||
@group
|
||
(progn
|
||
(split-window)
|
||
(with-selected-window (selected-window)
|
||
(pop-to-buffer "*Messages*")))
|
||
@end group
|
||
@end example
|
||
|
||
@noindent
|
||
will not.
|
||
|
||
Also, invocations of action functions like
|
||
@code{display-buffer-use-some-window} and
|
||
@code{display-buffer-use-least-recent-window} that expect the selected
|
||
window to have the highest use time among all windows, may fail to
|
||
produce a window according to their specifications.
|
||
|
||
Hence, an application that relies on using a window excursion should try
|
||
to postpone the @code{display-buffer} call until after the excursion has
|
||
terminated.
|
||
@end table
|
||
|
||
@node Window History
|
||
@section Window History
|
||
@cindex window history
|
||
|
||
Each window remembers in a list the buffers it has previously
|
||
displayed, and the order in which these buffers were removed from it.
|
||
This history is used, for example, by @code{replace-buffer-in-windows}
|
||
(@pxref{Buffers and Windows}), and when quitting windows
|
||
(@pxref{Quitting Windows}). The list is automatically maintained by
|
||
Emacs, but you can use the following functions to explicitly inspect
|
||
or alter it:
|
||
|
||
@defun window-prev-buffers &optional window
|
||
This function returns a list specifying the previous contents of
|
||
@var{window}. The optional argument @var{window} should be a live
|
||
window and defaults to the selected one.
|
||
|
||
Each list element has the form @code{(@var{buffer} @var{window-start}
|
||
@var{window-pos})}, where @var{buffer} is a buffer previously shown in
|
||
the window, @var{window-start} is the window start position
|
||
(@pxref{Window Start and End}) when that buffer was last shown, and
|
||
@var{window-pos} is the point position (@pxref{Window Point}) when
|
||
that buffer was last shown in @var{window}.
|
||
|
||
The list is ordered so that earlier elements correspond to more
|
||
recently-shown buffers, and the first element usually corresponds to the
|
||
buffer most recently removed from the window.
|
||
@end defun
|
||
|
||
@defun set-window-prev-buffers window prev-buffers
|
||
This function sets @var{window}'s previous buffers to the value of
|
||
@var{prev-buffers}. The argument @var{window} must be a live window
|
||
and defaults to the selected one. The argument @var{prev-buffers}
|
||
should be a list of the same form as that returned by
|
||
@code{window-prev-buffers}.
|
||
@end defun
|
||
|
||
In addition, each window maintains a list of @dfn{next buffers}, which
|
||
is a list of buffers re-shown by @code{switch-to-prev-buffer} (see
|
||
below). This list is mainly used by @code{switch-to-prev-buffer} and
|
||
@code{switch-to-next-buffer} for choosing buffers to switch to.
|
||
|
||
@defun window-next-buffers &optional window
|
||
This function returns the list of buffers recently re-shown in
|
||
@var{window} via @code{switch-to-prev-buffer}. The @var{window}
|
||
argument must denote a live window or @code{nil} (meaning the selected
|
||
window).
|
||
@end defun
|
||
|
||
@defun set-window-next-buffers window next-buffers
|
||
This function sets the next buffer list of @var{window} to
|
||
@var{next-buffers}. The @var{window} argument should be a live window
|
||
or @code{nil} (meaning the selected window). The argument
|
||
@var{next-buffers} should be a list of buffers.
|
||
@end defun
|
||
|
||
The following commands can be used to cycle through the global buffer
|
||
list, much like @code{bury-buffer} and @code{unbury-buffer}. However,
|
||
they cycle according to the specified window's history list, rather
|
||
than the global buffer list. In addition, they restore
|
||
window-specific window start and point positions, and may show a
|
||
buffer even if it is already shown in another window. The
|
||
@code{switch-to-prev-buffer} command, in particular, is used by
|
||
@code{replace-buffer-in-windows}, @code{bury-buffer} and
|
||
@code{quit-window} to find a replacement buffer for a window.
|
||
|
||
@deffn Command switch-to-prev-buffer &optional window bury-or-kill
|
||
This command displays the previous buffer in @var{window}. The
|
||
argument @var{window} should be a live window or @code{nil} (meaning
|
||
the selected window). If the optional argument @var{bury-or-kill} is
|
||
non-@code{nil}, this means that the buffer currently shown in
|
||
@var{window} is about to be buried or killed and consequently should
|
||
not be switched to in future invocations of this command.
|
||
|
||
The previous buffer is usually the buffer shown before the buffer
|
||
currently shown in @var{window}. However, a buffer that has been buried
|
||
or killed, or has been already shown by a recent invocation of
|
||
@code{switch-to-prev-buffer}, does not qualify as previous buffer.
|
||
|
||
If repeated invocations of this command have already shown all buffers
|
||
previously shown in @var{window}, further invocations will show buffers
|
||
from the buffer list of the frame @var{window} appears on (@pxref{Buffer
|
||
List}).
|
||
|
||
The option @code{switch-to-prev-buffer-skip} described below can be
|
||
used to inhibit switching to certain buffers, for example, to those
|
||
already shown in another window. Also, if @var{window}'s frame has a
|
||
@code{buffer-predicate} parameter (@pxref{Buffer Parameters}), that
|
||
predicate may inhibit switching to certain buffers.
|
||
@end deffn
|
||
|
||
@deffn Command switch-to-next-buffer &optional window
|
||
This command switches to the next buffer in @var{window}, thus undoing
|
||
the effect of the last @code{switch-to-prev-buffer} command in
|
||
@var{window}. The argument @var{window} must be a live window and
|
||
defaults to the selected one.
|
||
|
||
If there is no recent invocation of @code{switch-to-prev-buffer} that
|
||
can be undone, this function tries to show a buffer from the buffer list
|
||
of the frame @var{window} appears on (@pxref{Buffer List}).
|
||
|
||
The option @code{switch-to-prev-buffer-skip} and the
|
||
@code{buffer-predicate} (@pxref{Buffer Parameters}) of @var{window}'s
|
||
frame affect this command as they do for @code{switch-to-prev-buffer}.
|
||
@end deffn
|
||
|
||
By default @code{switch-to-prev-buffer} and
|
||
@code{switch-to-next-buffer} can switch to a buffer that is already
|
||
shown in another window. The following option can be used to override
|
||
this behavior.
|
||
|
||
@defopt switch-to-prev-buffer-skip
|
||
If this variable is @code{nil}, @code{switch-to-prev-buffer} may
|
||
switch to any buffer, including those already shown in other windows.
|
||
|
||
If this variable is non-@code{nil}, @code{switch-to-prev-buffer} will
|
||
refrain from switching to certain buffers. The following values can
|
||
be used:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
@code{this} means do not switch to a buffer shown on the frame that
|
||
hosts the window @code{switch-to-prev-buffer} is acting upon.
|
||
|
||
@item
|
||
@code{visible} means do not switch to a buffer shown on any visible
|
||
frame.
|
||
|
||
@item
|
||
0 (the number zero) means do not switch to a buffer shown on any
|
||
visible or iconified frame.
|
||
|
||
@item
|
||
@code{t} means do not switch to a buffer shown on any live frame.
|
||
|
||
@item
|
||
A function that takes three arguments---the @var{window} argument of
|
||
@code{switch-to-prev-buffer}, a buffer @code{switch-to-prev-buffer}
|
||
intends to switch to and the @var{bury-or-kill} argument of
|
||
@code{switch-to-prev-buffer}. If that function returns
|
||
non-@code{nil}, @code{switch-to-prev-buffer} will refrain from
|
||
switching to the buffer specified by the second argument.
|
||
@end itemize
|
||
|
||
The command @code{switch-to-next-buffer} obeys this option in a
|
||
similar way. If this option specifies a function,
|
||
@code{switch-to-next-buffer} will call that function with the third
|
||
argument always @code{nil}.
|
||
|
||
Note that since @code{switch-to-prev-buffer} is called by
|
||
@code{bury-buffer}, @code{replace-buffer-in-windows} and
|
||
@code{quit-restore-window} as well, customizing this option may also
|
||
affect the behavior of Emacs when a window is quit or a buffer gets
|
||
buried or killed.
|
||
|
||
Note also that under certain circumstances
|
||
@code{switch-to-prev-buffer} and @code{switch-to-next-buffer} may
|
||
ignore this option, for example, when there is only one buffer left
|
||
these functions can switch to.
|
||
@end defopt
|
||
|
||
@defopt switch-to-prev-buffer-skip-regexp
|
||
This user option should be either a regular expression or a list of
|
||
regular expressions. Buffers whose names match one of those regular
|
||
expressions will be ignored by @code{switch-to-prev-buffer} and
|
||
@code{switch-to-next-buffer} (except when there's no other buffer to
|
||
switch to).
|
||
@end defopt
|
||
|
||
@node Dedicated Windows
|
||
@section Dedicated Windows
|
||
@cindex dedicated window
|
||
|
||
Functions for displaying a buffer can be told to not use specific
|
||
windows by marking these windows as @dfn{dedicated} to their buffers.
|
||
@code{display-buffer} (@pxref{Choosing Window}) never uses a dedicated
|
||
window for displaying another buffer in it. @code{get-lru-window} and
|
||
@code{get-largest-window} (@pxref{Cyclic Window Ordering}) do not
|
||
consider dedicated windows as candidates when their @var{dedicated}
|
||
argument is non-@code{nil}. The behavior of @code{set-window-buffer}
|
||
(@pxref{Buffers and Windows}) with respect to dedicated windows is
|
||
slightly different, see below.
|
||
|
||
Functions supposed to remove a buffer from a window or a window from
|
||
a frame can behave specially when a window they operate on is dedicated.
|
||
We will distinguish four basic cases, namely where (1) the window is
|
||
not the only window on its frame, (2) the window is the only window on
|
||
its frame but there are other frames on the same terminal left, (3)
|
||
the window is the only window on the only frame on the same terminal,
|
||
and (4) the dedication's value is @code{side}
|
||
(@pxref{Displaying Buffers in Side Windows}).
|
||
|
||
In particular, @code{delete-windows-on} (@pxref{Deleting Windows})
|
||
handles case (2) by deleting the associated frame and cases (3) and (4)
|
||
by showing another buffer in that frame's only window. The function
|
||
@code{replace-buffer-in-windows} (@pxref{Buffers and Windows}) which is
|
||
called when a buffer gets killed, deletes the window in case (1) and
|
||
behaves like @code{delete-windows-on} otherwise.
|
||
|
||
When @code{bury-buffer} (@pxref{Buffer List}) operates on the
|
||
selected window (which shows the buffer that shall be buried), it
|
||
handles case (2) by calling @code{frame-auto-hide-function}
|
||
(@pxref{Quitting Windows}) to deal with the selected frame. The other
|
||
two cases are handled as with @code{replace-buffer-in-windows}.
|
||
|
||
@defun window-dedicated-p &optional window
|
||
This function returns non-@code{nil} if @var{window} is dedicated to its
|
||
buffer and @code{nil} otherwise. More precisely, the return value is
|
||
the value assigned by the last call of @code{set-window-dedicated-p} for
|
||
@var{window}, or @code{nil} if that function was never called with
|
||
@var{window} as its argument. The default for @var{window} is the
|
||
selected window.
|
||
@end defun
|
||
|
||
@findex toggle-window-dedicated
|
||
@defun set-window-dedicated-p window flag
|
||
This function marks @var{window} as dedicated to its buffer if
|
||
@var{flag} is non-@code{nil}, and non-dedicated otherwise.
|
||
Interactively you can use the @kbd{C-x w d}
|
||
(@code{toggle-window-dedicated}) command to do the same.
|
||
|
||
As a special case, if @var{flag} is @code{t}, @var{window} becomes
|
||
@dfn{strongly} dedicated to its buffer. @code{set-window-buffer}
|
||
signals an error when the window it acts upon is strongly dedicated to
|
||
its buffer and does not already display the buffer it is asked to
|
||
display. Other functions do not treat @code{t} differently from any
|
||
non-@code{nil} value.
|
||
@end defun
|
||
|
||
You can also tell @code{display-buffer} to mark a window it creates as
|
||
dedicated to its buffer by providing a suitable @code{dedicated}
|
||
action alist entry (@pxref{Buffer Display Action Alists}).
|
||
|
||
@node Quitting Windows
|
||
@section Quitting Windows
|
||
@cindex quitting windows
|
||
|
||
After a command uses @code{display-buffer} to put a buffer on the
|
||
screen, the user may decide to hide it and return to the previous
|
||
configuration of the Emacs display. We call that @dfn{quitting the
|
||
window}. The way to do this is to call @code{quit-window} while the
|
||
window used by @code{display-buffer} is the selected window.
|
||
|
||
The right way to restore the previous configuration of the display
|
||
depends on what was done to the window where the buffer now appears.
|
||
It might be right to delete that window, or delete its frame, or just
|
||
display another buffer in that window. One complication is that the
|
||
user may have changed the window configuration since the act of
|
||
displaying that buffer, and it would be undesirable to undo the user's
|
||
explicitly requested changes.
|
||
|
||
To enable @code{quit-window} to do the right thing,
|
||
@code{display-buffer} saves information about what it did in the
|
||
window's @code{quit-restore} parameter (@pxref{Window Parameters}).
|
||
|
||
@deffn Command quit-window &optional kill window
|
||
This command quits @var{window} and buries its buffer. The argument
|
||
@var{window} must be a live window and defaults to the selected one.
|
||
With prefix argument @var{kill} non-@code{nil}, it kills the buffer
|
||
instead of burying it.
|
||
|
||
@vindex quit-window-hook
|
||
The function @code{quit-window} first runs @code{quit-window-hook}.
|
||
Then it calls the function @code{quit-restore-window}, described next,
|
||
which does the hard work.
|
||
@end deffn
|
||
|
||
You can get more control by calling @code{quit-restore-window} instead.
|
||
|
||
@defun quit-restore-window &optional window bury-or-kill
|
||
This function handles @var{window} and its buffer after quitting. The
|
||
optional argument @var{window} must be a live window and defaults to
|
||
the selected one. The function takes account of the @var{window}'s
|
||
@code{quit-restore} parameter.
|
||
|
||
The optional argument @var{bury-or-kill} specifies how to deal with
|
||
@var{window}'s buffer. The following values are meaningful:
|
||
|
||
@table @code
|
||
@item nil
|
||
This means to not deal with the buffer in any particular way. As a
|
||
consequence, if @var{window} is not deleted, invoking
|
||
@code{switch-to-prev-buffer} will usually show the buffer again.
|
||
|
||
@item append
|
||
This means that if @var{window} is not deleted, its buffer is moved to
|
||
the end of @var{window}'s list of previous buffers (@pxref{Window
|
||
History}), so it's less likely that future invocations of
|
||
@code{switch-to-prev-buffer} will switch to it. Also, it moves the
|
||
buffer to the end of the frame's buffer list (@pxref{Buffer List}).
|
||
|
||
@item bury
|
||
This means that if @var{window} is not deleted, its buffer is removed
|
||
from @var{window}'s list of previous buffers. Also, it moves the
|
||
buffer to the end of the frame's buffer list. This is the most
|
||
reliable way to prevent @code{switch-to-prev-buffer} from switching to
|
||
this buffer again, short of killing the buffer.
|
||
|
||
@item kill
|
||
This means to kill @var{window}'s buffer.
|
||
|
||
@item killing
|
||
This is handled like @code{kill} but assumes that @var{window}'s buffer
|
||
gets killed elsewhere. This value is used by
|
||
@code{replace-buffer-in-windows} and @code{quit-windows-on}.
|
||
|
||
@item burying
|
||
This is handled like @code{bury} but assumes that @var{window}'s buffer
|
||
gets buried elsewhere. This value is used by @code{quit-windows-on}.
|
||
@end table
|
||
|
||
The argument @var{bury-or-kill} also specifies what to do with
|
||
@var{window}'s frame when @var{window} should be deleted, if it is the
|
||
only window on its frame, and there are other frames on that frame's
|
||
terminal. If @var{bury-or-kill} equals @code{kill}, it means to
|
||
delete the frame. Otherwise, the fate of the frame is determined by
|
||
calling @code{frame-auto-hide-function} (see below) with that frame as
|
||
sole argument.
|
||
@end defun
|
||
|
||
A window's @code{quit-restore} and @code{quit-restore-prev} parameters
|
||
(@pxref{Window Parameters}) guide @code{quit-restore-window} through its
|
||
process of dealing with its @var{window} argument. If such a parameter
|
||
is absent or @code{nil}, this usually means that the window has been
|
||
created by a command like @code{split-window-below} or
|
||
@code{split-window-right} (@pxref{Split Window,,, emacs, The GNU Emacs
|
||
Manual}) and @code{quit-restore-window} will delete the window only if
|
||
it was dedicated to its buffer.
|
||
|
||
If non-@code{nil}, any such parameter is a list of four elements:
|
||
|
||
@lisp
|
||
(@var{method} @var{obuffer} @var{owindow} @var{this-buffer})
|
||
@end lisp
|
||
|
||
The first element, @var{method}, is one of the four symbols
|
||
@code{window}, @code{frame}, @code{same} and @code{other}.
|
||
@code{frame} and @code{window} control how to delete @var{window},
|
||
while @code{same} and @code{other} control displaying some other
|
||
buffer in it.
|
||
|
||
Specifically, @code{window} means that the window has been specially
|
||
created by @code{display-buffer}; @code{frame} means that a separate
|
||
frame has been created; @code{same}, that the window has only ever
|
||
displayed this buffer; @code{other}, that the window showed another
|
||
buffer before.
|
||
|
||
The second element, @var{obuffer}, is either one of the symbols
|
||
@code{window} or @code{frame}, or a list of the form
|
||
|
||
@lisp
|
||
(@var{prev-buffer} @var{prev-window-start} @var{prev-window-point} @var{height})
|
||
@end lisp
|
||
|
||
@noindent
|
||
which says which buffer was shown in @var{window} before, that
|
||
buffer's window start (@pxref{Window Start and End}) and window point
|
||
(@pxref{Window Point}) positions at that time, and
|
||
@var{window}'s height at that time. If @var{prev-buffer} is still
|
||
live when quitting @var{window}, quitting the window may reuse
|
||
@var{window} to display @var{prev-buffer}.
|
||
|
||
The third element, @var{owindow}, is the window that was selected
|
||
just before the displaying was done. If quitting deletes
|
||
@var{window}, it tries to select @var{owindow}.
|
||
|
||
The fourth element, @var{this-buffer}, is the buffer whose displaying
|
||
set the @code{quit-restore} parameter. Quitting @var{window} will use
|
||
the information stored by that parameter if and only if it still shows
|
||
that buffer.
|
||
|
||
@code{quit-restore-window} tries to delete its @var{window} if (1)
|
||
@var{method} is either @code{window} or @code{frame}, (2) the window has
|
||
no history of previously-displayed buffers and (3) @var{this-buffer}
|
||
equals the buffer currently displayed in @var{window}. If @var{window}
|
||
is part of an atomic window (@pxref{Atomic Windows}), it will try to
|
||
delete the root of that atomic window instead. In either case, it tries
|
||
to avoid signaling an error when @var{window} cannot be deleted.
|
||
|
||
If @var{obuffer} is a list, and @var{prev-buffer} is still live,
|
||
quitting displays @var{prev-buffer} in @var{window} according to the
|
||
rest of the elements of @var{obuffer}. This includes resizing the
|
||
window to @var{height} if it was temporarily resized to display
|
||
@var{this-buffer}.
|
||
|
||
Otherwise, if @var{window} was previously used for displaying other
|
||
buffers (@pxref{Window History}), the most recent buffer in that
|
||
history will be displayed.
|
||
|
||
Conceptually, the @code{quit-restore} parameter is used for undoing
|
||
the first buffer display operation for a specific window. The
|
||
@code{quit-restore-prev} parameter is used for undoing the last buffer
|
||
display operation in a row of such operations for a specific window.
|
||
Any buffer display operation for that window that happened in between,
|
||
is undone by displaying the buffer previously shown in that window.
|
||
|
||
@code{display-buffer} sets up the @code{quit-restore} parameter of any
|
||
window it uses when that window has been either created by it or has no
|
||
non-@code{nil} @code{quit-restore} parameter. If the window already has
|
||
a @code{quit-restore} parameter, @code{display-buffer} adds a
|
||
@code{quit-restore-prev} parameter whose @var{method} element is either
|
||
@code{same} or @code{other}. In either case, if the window already has
|
||
a @code{quit-restore-prev} or @code{quit-restore} parameter, it may
|
||
update that parameter's contents.
|
||
|
||
@code{quit-restore-window} now first tries to find a suitable
|
||
@code{quit-restore-prev} parameter for its window telling which buffer
|
||
to show instead. If it doesn't find one, it will look for a suitable
|
||
@code{quit-restore} parameter to either delete the window or show
|
||
another buffer in it.
|
||
|
||
Once it has used one of these parameters, @code{quit-restore-window}
|
||
resets it to @code{nil}. Parameters it did not use are left alone. Any
|
||
of these parameters are also reset by @code{replace-buffer-in-windows}
|
||
(@pxref{Buffers and Windows}) when they reference a buffer that is about
|
||
to be killed, either as the buffer specified by @var{prev-buffer} or as
|
||
the buffer specified by @var{this-buffer}.
|
||
|
||
All operations on these parameters are supposed to preserve the
|
||
following invariant: If a window has a non-@code{nil}
|
||
@code{quit-restore-prev} parameter, it also has a non-@code{nil}
|
||
@code{quit-restore} parameter.
|
||
|
||
The following option allows @code{quit-restore-window} to delete its
|
||
window more aggressively.
|
||
|
||
@defopt quit-restore-window-no-switch
|
||
If this option is @code{nil}, @code{quit-restore-window} will always
|
||
call @code{switch-to-prev-buffer} unless the window has been made by
|
||
@code{display-buffer}. If this is @code{t}, @code{quit-restore-window}
|
||
will try hard to switch only to buffers previously shown in that window.
|
||
If this is the symbol @code{skip-first}, it will switch to a previous
|
||
buffer if and only the window has at least two previous buffers.
|
||
|
||
In either case, if @code{quit-restore-window} doesn't switch to a
|
||
previous buffer, it will try to delete the window (and maybe its
|
||
frame) instead. Note also that if a window is dedicated,
|
||
@code{quit-restore-window} will usually not switch to a previous
|
||
buffer in it either.
|
||
@end defopt
|
||
|
||
@ignore
|
||
@c FIXME: Should we document display-buffer-reuse-window?
|
||
If we document display-buffer-record-window, it should be with @defun.
|
||
And maybe not here.
|
||
|
||
|
||
Typically, the display routines run by @code{display-buffer} will set
|
||
the @code{quit-restore} window parameter correctly. You can also set
|
||
it manually, using the following code for displaying @var{buffer} in
|
||
@var{window}:
|
||
|
||
@example
|
||
@group
|
||
(display-buffer-record-window type window buffer)
|
||
|
||
(set-window-buffer window buffer)
|
||
|
||
(set-window-prev-buffers window nil)
|
||
@end group
|
||
@end example
|
||
|
||
Setting the window history to @code{nil} ensures that a future call to
|
||
@code{quit-window} can delete the window altogether.
|
||
@end ignore
|
||
|
||
The following option specifies a function to do the right thing with a
|
||
frame containing one window when quitting that window.
|
||
|
||
@defopt frame-auto-hide-function
|
||
The function specified by this option is called to automatically hide
|
||
frames. This function is called with one argument---a frame.
|
||
|
||
The function specified here is called by @code{bury-buffer}
|
||
(@pxref{Buffer List}) when the selected window is dedicated and shows
|
||
the buffer to bury. It is also called by @code{quit-restore-window}
|
||
(see above) when the frame of the window to quit has been specially
|
||
created for displaying that window's buffer and the buffer is not
|
||
killed.
|
||
|
||
The default is to call @code{iconify-frame} (@pxref{Visibility of
|
||
Frames}). Alternatively, you may specify either @code{delete-frame}
|
||
(@pxref{Deleting Frames}) to remove the frame from its display,
|
||
@code{make-frame-invisible} to make the frame invisible, @code{ignore}
|
||
to leave the frame unchanged, or any other function that can take a
|
||
frame as its sole argument.
|
||
|
||
Note that the function specified by this option is called only if the
|
||
specified frame contains just one live window and there is at least one
|
||
other frame on the same terminal.
|
||
|
||
For a particular frame, the value specified here may be overridden by
|
||
that frame's @code{auto-hide-function} frame parameter (@pxref{Frame
|
||
Interaction Parameters}).
|
||
@end defopt
|
||
|
||
@node Side Windows
|
||
@section Side Windows
|
||
@cindex side windows
|
||
@cindex main window
|
||
@cindex main window of a frame
|
||
|
||
Side windows are special windows positioned at any of the four sides of
|
||
a frame's root window (@pxref{Windows and Frames}). In practice, this
|
||
means that the area of the frame's root window is subdivided into a main
|
||
window and a number of side windows surrounding that main window. The
|
||
main window is either a ``normal'' live window or specifies the area
|
||
containing all the normal windows.
|
||
|
||
In their most simple form of use, side windows allow displaying
|
||
specific buffers always in the same area of a frame. Hence they can
|
||
be regarded as a generalization of the concept provided by
|
||
@code{display-buffer-at-bottom} (@pxref{Buffer Display Action
|
||
Functions}) to the remaining sides of a frame. With suitable
|
||
customizations, however, side windows can be also used to provide
|
||
frame layouts similar to those found in so-called integrated
|
||
development environments (IDEs).
|
||
|
||
@menu
|
||
* Displaying Buffers in Side Windows:: An action function for displaying
|
||
buffers in side windows.
|
||
* Side Window Options and Functions:: Further tuning of side windows.
|
||
* Frame Layouts with Side Windows:: Setting up frame layouts with side
|
||
windows.
|
||
@end menu
|
||
|
||
|
||
@node Displaying Buffers in Side Windows
|
||
@subsection Displaying Buffers in Side Windows
|
||
|
||
The following action function for @code{display-buffer} (@pxref{Buffer
|
||
Display Action Functions}) creates or reuses a side window for
|
||
displaying the specified buffer.
|
||
|
||
@defun display-buffer-in-side-window buffer alist
|
||
This function displays @var{buffer} in a side window of the selected
|
||
frame. It returns the window used for displaying @var{buffer},
|
||
@code{nil} if no such window can be found or created.
|
||
|
||
@var{alist} is an association list of symbols and values as for
|
||
@code{display-buffer}. The following symbols in @var{alist} are special
|
||
for this function:
|
||
|
||
@table @code
|
||
@item side
|
||
Denotes the side of the frame where the window shall be located. Valid
|
||
values are @code{left}, @code{top}, @code{right} and @code{bottom}. If
|
||
unspecified, the window is located at the bottom of the frame.
|
||
|
||
@item slot
|
||
Denotes a slot at the specified side where to locate the window. A
|
||
value of zero means to preferably position the window in the middle of
|
||
the specified side. A negative value means to use a slot preceding
|
||
(that is, above or on the left of) the middle slot. A positive value
|
||
means to use a slot following (that is, below or on the right of) the
|
||
middle slot. Hence, all windows on a specific side are ordered by their
|
||
@code{slot} value. If unspecified, the window is located in the middle
|
||
of the specified side.
|
||
|
||
@item dedicated
|
||
The dedicated flag (@pxref{Dedicated Windows}) has a slightly different
|
||
meaning for side windows. When a side window is created, that flag is
|
||
set to the value @code{side} to prevent @code{display-buffer} to use the
|
||
window in other action functions. Its value persists across invocations
|
||
of @code{quit-window}, @code{kill-buffer}, @code{previous-buffer} and
|
||
@code{next-buffer}.
|
||
|
||
In particular, these commands will refrain from showing, in a side
|
||
window, buffers that have not been displayed in that window before.
|
||
They will also refrain from having a normal, non-side window show a
|
||
buffer that has been already displayed in a side window. A notable
|
||
exception to the latter rule occurs when an application, after
|
||
displaying a buffer, resets that buffer’s local variables. To override
|
||
these rules and always delete a side window with @code{quit-window} or
|
||
@code{kill-buffer}, and eventually prevent the use of
|
||
@code{previous-buffer} and @code{next-buffer}, set this value to
|
||
@code{t} or specify a value via @code{display-buffer-mark-dedicated}.
|
||
@end table
|
||
|
||
If you specify the same slot on the same side for two or more different
|
||
buffers, the buffer displayed last is shown in the corresponding window.
|
||
Hence, slots can be used for sharing the same side window between
|
||
buffers.
|
||
|
||
This function installs the @code{window-side} and @code{window-slot}
|
||
parameters (@pxref{Window Parameters}) and makes them persistent. It
|
||
does not install any other window parameters unless they have been
|
||
explicitly provided via a @code{window-parameters} entry in @var{alist}.
|
||
@end defun
|
||
|
||
By default, side windows cannot be split via @code{split-window}
|
||
(@pxref{Splitting Windows}). Also, a side window is not reused or
|
||
split by any buffer display action (@pxref{Buffer Display Action
|
||
Functions}) unless it is explicitly specified as target of that
|
||
action. Note also that @code{delete-other-windows} cannot make a side
|
||
window the only window on its frame (@pxref{Deleting Windows}).
|
||
|
||
|
||
@node Side Window Options and Functions
|
||
@subsection Side Window Options and Functions
|
||
|
||
The following options provide additional control over the placement of
|
||
side windows.
|
||
|
||
@defopt window-sides-vertical
|
||
If non-@code{nil}, the side windows on the left and right of a frame
|
||
occupy the frame's full height. Otherwise, the side windows on the top
|
||
and bottom of the frame occupy the frame's full width.
|
||
@end defopt
|
||
|
||
@defopt window-sides-slots
|
||
This option specifies the maximum number of side windows on each side of
|
||
a frame. The value is a list of four elements specifying the number of
|
||
side window slots on (in this order) the left, top, right and bottom of
|
||
each frame. If an element is a number, it means to display at most that
|
||
many windows on the corresponding side. If an element is @code{nil}, it
|
||
means there's no bound on the number of slots on that side.
|
||
|
||
If any of the specified values is zero, no window can be created on the
|
||
corresponding side. @code{display-buffer-in-side-window} will not
|
||
signal an error in that case, but will return @code{nil}. If a specified
|
||
value just forbids the creation of an additional side window, the most
|
||
suitable window on that side is reused and may have its
|
||
@code{window-slot} parameter changed accordingly.
|
||
@end defopt
|
||
|
||
@defopt window-sides-reversed
|
||
This option specifies whether top/bottom side windows should appear in
|
||
reverse order. When this is @code{nil}, side windows on the top and
|
||
bottom of a frame are always drawn from left to right with increasing
|
||
slot values. When this is @code{t}, the drawing order is reversed and
|
||
side windows on the top and bottom of a frame are drawn from right to
|
||
left with increasing slot values.
|
||
|
||
When this is @code{bidi}, the drawing order is reversed if and only if
|
||
the value of @code{bidi-paragraph-direction} (@pxref{Bidirectional
|
||
Display}) is @code{right-to-left} in the buffer displayed in the window
|
||
most recently selected within the main window area of this frame.
|
||
Sometimes that window may be hard to find, so heuristics are used to
|
||
avoid that the drawing order changes inadvertently when another window
|
||
gets selected.
|
||
|
||
The layout of side windows on the left or right of a frame is not
|
||
affected by the value of this variable.
|
||
@end defopt
|
||
|
||
When a frame has side windows, the following function returns the main
|
||
window of that frame.
|
||
|
||
@defun window-main-window &optional frame
|
||
This function returns the main window of the specified @var{frame}. The
|
||
optional argument @var{frame} must be a live frame and defaults to the
|
||
selected one.
|
||
|
||
If @var{frame} has no side windows, it returns @var{frame}'s root
|
||
window. Otherwise, it returns either an internal non-side window such
|
||
that all other non-side windows on @var{frame} descend from it, or the
|
||
single live non-side window of @var{frame}. Note that the main window
|
||
of a frame cannot be deleted via @code{delete-window}.
|
||
@end defun
|
||
|
||
The following command is handy to toggle the appearance of all side
|
||
windows on a specified frame.
|
||
|
||
@deffn Command window-toggle-side-windows &optional frame
|
||
This command toggles side windows on the specified @var{frame}. The
|
||
optional argument @var{frame} must be a live frame and defaults to the
|
||
selected one.
|
||
|
||
If @var{frame} has at least one side window, this command saves the
|
||
state of @var{frame}'s root window in the @var{frame}'s
|
||
@code{window-state} frame parameter and deletes all side windows on
|
||
@var{frame} afterwards.
|
||
|
||
If @var{frame} has no side windows, but does have a @code{window-state}
|
||
parameter, this command uses that parameter's value to restore the side
|
||
windows on @var{frame} leaving @var{frame}'s main window alone.
|
||
|
||
An error is signaled if @var{frame} has no side windows and no saved
|
||
state is found for it.
|
||
@end deffn
|
||
|
||
|
||
@node Frame Layouts with Side Windows
|
||
@subsection Frame Layouts with Side Windows
|
||
|
||
Side windows can be used to create more complex frame layouts like those
|
||
provided by integrated development environments (IDEs). In such
|
||
layouts, the area of the main window is where the normal editing
|
||
activities take place. Side windows are not conceived for editing in
|
||
the usual sense. Rather, they are supposed to display information
|
||
complementary to the current editing activity, like lists of files, tags
|
||
or buffers, help information, search or grep results or shell output.
|
||
|
||
The layout of such a frame might appear as follows:
|
||
|
||
@smallexample
|
||
@group
|
||
___________________________________
|
||
| *Buffer List* |
|
||
|___________________________________|
|
||
| | | |
|
||
| * | | * |
|
||
| d | | T |
|
||
| i | | a |
|
||
| r | Main Window Area | g |
|
||
| e | | s |
|
||
| d | | * |
|
||
| * | | |
|
||
|_____|_______________________|_____|
|
||
| *help*/*grep*/ | *shell*/ |
|
||
| *Completions* | *compilation* |
|
||
|_________________|_________________|
|
||
| Echo Area |
|
||
|___________________________________|
|
||
|
||
|
||
@end group
|
||
@end smallexample
|
||
|
||
The following example illustrates how window parameters (@pxref{Window
|
||
Parameters}) can be used with @code{display-buffer-in-side-window}
|
||
(@pxref{Displaying Buffers in Side Windows}) to set up code for
|
||
producing the frame layout sketched above.
|
||
|
||
@example
|
||
@group
|
||
(defvar parameters
|
||
'(window-parameters . ((no-other-window . t)
|
||
(no-delete-other-windows . t))))
|
||
|
||
(setq fit-window-to-buffer-horizontally t)
|
||
(setq window-resize-pixelwise t)
|
||
|
||
(setq
|
||
display-buffer-alist
|
||
`(("\\*Buffer List\\*" display-buffer-in-side-window
|
||
(side . top) (slot . 0) (window-height . fit-window-to-buffer)
|
||
(preserve-size . (nil . t)) ,parameters)
|
||
("\\*Tags List\\*" display-buffer-in-side-window
|
||
(side . right) (slot . 0) (window-width . fit-window-to-buffer)
|
||
(preserve-size . (t . nil)) ,parameters)
|
||
("\\*\\(?:help\\|grep\\|Completions\\)\\*"
|
||
display-buffer-in-side-window
|
||
(side . bottom) (slot . -1) (preserve-size . (nil . t))
|
||
,parameters)
|
||
("\\*\\(?:shell\\|compilation\\)\\*" display-buffer-in-side-window
|
||
(side . bottom) (slot . 1) (preserve-size . (nil . t))
|
||
,parameters)))
|
||
@end group
|
||
@end example
|
||
|
||
This specifies @code{display-buffer-alist} entries (@pxref{Choosing
|
||
Window}) for buffers with fixed names. In particular, it asks for
|
||
showing @file{*Buffer List*} with adjustable height at the top of the
|
||
frame and @file{*Tags List*} with adjustable width on the frame's right.
|
||
It also asks for having the @file{*help*}, @file{*grep*} and
|
||
@file{*Completions*} buffers share a window on the bottom left side of
|
||
the frame and the @file{*shell*} and @file{*compilation*} buffers appear
|
||
in a window on the bottom right side of the frame.
|
||
|
||
Note that the option @code{fit-window-to-buffer-horizontally} must
|
||
have a non-@code{nil} value in order to allow horizontal adjustment of
|
||
windows. Entries are also added that ask for preserving the height of
|
||
side windows at the top and bottom of the frame and the width of side
|
||
windows at the left or right of the frame. To assure that side windows
|
||
retain their respective sizes when maximizing the frame, the variable
|
||
@code{window-resize-pixelwise} is set to a non-@code{nil} value.
|
||
@xref{Resizing Windows}.
|
||
|
||
The last form also makes sure that none of the created side windows
|
||
are accessible via @w{@kbd{C-x o}} by installing the @code{no-other-window}
|
||
parameter for each of these windows. In addition, it makes sure that
|
||
side windows are not deleted via @w{@kbd{C-x 1}} by installing the
|
||
@code{no-delete-other-windows} parameter for each of these windows.
|
||
|
||
Since @code{dired} buffers have no fixed names, we use a special
|
||
function @code{dired-default-directory-on-left} in order to display a
|
||
lean directory buffer on the left side of the frame.
|
||
|
||
@example
|
||
@group
|
||
(defun dired-default-directory-on-left ()
|
||
"Display `default-directory' in side window on left, hiding details."
|
||
(interactive)
|
||
(let ((buffer (dired-noselect default-directory)))
|
||
(with-current-buffer buffer (dired-hide-details-mode t))
|
||
(display-buffer-in-side-window
|
||
buffer `((side . left) (slot . 0)
|
||
(window-width . fit-window-to-buffer)
|
||
(preserve-size . (t . nil)) ,parameters))))
|
||
@end group
|
||
@end example
|
||
|
||
Evaluating the preceding forms and typing, in any order, @w{@kbd{M-x
|
||
list-buffers}}, @kbd{C-h f}, @kbd{M-x shell}, @w{@kbd{M-x list-tags}},
|
||
and @kbd{M-x dired-default-directory-on-left} should now reproduce the
|
||
frame layout sketched above.
|
||
|
||
|
||
@node Atomic Windows
|
||
@section Atomic Windows
|
||
@cindex atomic windows
|
||
|
||
Atomic windows are rectangular compositions of at least two live
|
||
windows. They have the following distinctive characteristics:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
The function @code{split-window} (@pxref{Splitting Windows}), when
|
||
applied to a constituent of an atomic window, will try to create the new
|
||
window outside of the atomic window.
|
||
|
||
@item
|
||
The function @code{delete-window} (@pxref{Deleting Windows}), when
|
||
applied to a constituent of an atomic window, will try to delete the
|
||
entire atomic window instead.
|
||
|
||
@item
|
||
The function @code{delete-other-windows} (@pxref{Deleting Windows}),
|
||
when applied to a constituent of an atomic window, will try to make the
|
||
atomic window fill its frame or main window (@pxref{Side Windows}).
|
||
@end itemize
|
||
|
||
This means that the basic groups of functions that alter the window
|
||
structure treat an atomic window like a live one, thus preserving the
|
||
internal structure of the atomic window.
|
||
|
||
Atomic windows are useful to construct and preserve window layouts
|
||
that are meaningful only when all involved buffers are shown
|
||
simultaneously in a specific manner, such as when showing differences
|
||
between file revisions, or the same text in different languages or
|
||
markups. They can also be used to permanently display information
|
||
pertinent to a specific window in bars on that window's sides.
|
||
|
||
@cindex root window of atomic window
|
||
Atomic windows are implemented with the help of the reserved
|
||
@code{window-atom} window parameter (@pxref{Window Parameters}) and an
|
||
internal window (@pxref{Basic Windows}) called the root window of the
|
||
atomic window. All windows that are part of the same atomic window have
|
||
this root window as their common ancestor and are assigned a
|
||
non-@code{nil} @code{window-atom} parameter.
|
||
|
||
The following function returns the root of the atomic window a
|
||
specified window is part of:
|
||
|
||
@defun window-atom-root &optional window
|
||
This functions returns the root of the atomic window @var{window} is a
|
||
part of. The specified @var{window} must be a valid window and defaults
|
||
to the selected one. It returns @code{nil} if @var{window} is not part
|
||
of an atomic window.
|
||
@end defun
|
||
|
||
The most simple approach to make a new atomic window is to take an
|
||
existing internal window and apply the following function:
|
||
|
||
@defun window-make-atom window
|
||
This function converts @var{window} into an atomic window. The
|
||
specified @var{window} must be an internal window. All this function
|
||
does is to set the @code{window-atom} parameter of each descendant of
|
||
@var{window} to @code{t}.
|
||
@end defun
|
||
|
||
To create a new atomic window from an existing live window or to add a
|
||
new window to an existing atomic window, the following buffer display
|
||
action function (@pxref{Buffer Display Action Functions}) can be used:
|
||
|
||
@defun display-buffer-in-atom-window buffer alist
|
||
This function tries to display @var{buffer} in a new window that will be
|
||
combined with an existing window to form an atomic window. If the
|
||
existing window is already part of an atomic window, it adds the new
|
||
window to that atomic window.
|
||
|
||
The specified @var{alist} is an association list of symbols and values.
|
||
The following symbols have a special meaning:
|
||
|
||
@table @code
|
||
@item window
|
||
The value of such an element specifies an existing window the new window
|
||
shall be combined with. If it specifies an internal window, all
|
||
children of that window become part of the atomic window too. If no
|
||
window is specified, the new window becomes a sibling of the selected
|
||
window. The @code{window-atom} parameter of the existing window is set
|
||
to @code{main} provided that window is live and its @code{window-atom}
|
||
parameter was not already set.
|
||
|
||
@item side
|
||
The value of such an element denotes the side of the existing window
|
||
where the new window shall be located. Valid values are @code{below},
|
||
@code{right}, @code{above} and @code{left}. The default is
|
||
@code{below}. The @code{window-atom} parameter of the new window is set
|
||
to this value.
|
||
@end table
|
||
|
||
The return value is the new window, @code{nil} when creating that window
|
||
failed.
|
||
@end defun
|
||
|
||
Note that the value of the @code{window-atom} parameter does not really
|
||
matter as long as it is non-@code{nil}. The values assigned by
|
||
@code{display-buffer-in-atom-window} just allow for easy retrieval of
|
||
the original and the new window after that function has been applied.
|
||
Note also that the @code{window-atom} parameter is the only window
|
||
parameter assigned by @code{display-buffer-in-atom-window}. Further
|
||
parameters have to be set by the application explicitly via a
|
||
@code{window-parameters} entry in @var{alist}.
|
||
|
||
Atomic windows automatically cease to exist when one of their
|
||
constituents gets deleted. To dissolve an atomic window manually,
|
||
reset the @code{window-atom} parameter of its constituents---the root
|
||
of the atomic window and all its descendants.
|
||
|
||
The following code snippet, when applied to a single-window frame,
|
||
first splits the selected window and makes the selected and the new
|
||
window constituents of an atomic window with their parent as root. It
|
||
then displays the buffer @file{*Messages*} in a new window at the
|
||
frame's bottom and makes that new window part of the atomic window just
|
||
created.
|
||
|
||
@example
|
||
@group
|
||
(let ((window (split-window-right)))
|
||
(window-make-atom (window-parent window))
|
||
(display-buffer-in-atom-window
|
||
(get-buffer-create "*Messages*")
|
||
`((window . ,(window-parent window)) (window-height . 5))))
|
||
@end group
|
||
@end example
|
||
|
||
At this moment typing @w{@kbd{C-x 2}} in any window of that frame
|
||
produces a new window at the bottom of the frame. Typing @w{@kbd{C-x
|
||
3}} instead will put the new window at the frame's right. In either
|
||
case, typing now @w{@kbd{C-x 1}} in any window of the atomic window will
|
||
remove the new window only. Typing @w{@kbd{C-x 0}} in any window of the
|
||
atomic window will make that new window fill the frame.
|
||
|
||
|
||
@node Window Point
|
||
@section Windows and Point
|
||
@cindex window position
|
||
@cindex window point
|
||
@cindex position in window
|
||
@cindex point in window
|
||
|
||
Each window has its own value of point (@pxref{Point}), independent of
|
||
the value of point in other windows displaying the same buffer. This
|
||
makes it useful to have multiple windows showing one buffer.
|
||
|
||
@itemize @bullet
|
||
@item
|
||
The window point is established when a window is first created; it is
|
||
initialized from the buffer's point, or from the window point of another
|
||
window opened on the buffer if such a window exists.
|
||
|
||
@item
|
||
Selecting a window sets the value of point in its buffer from the
|
||
window's value of point. Conversely, deselecting a window sets the
|
||
window's value of point from that of the buffer. Thus, when you switch
|
||
between windows that display a given buffer, the point value for the
|
||
selected window is in effect in the buffer, while the point values for
|
||
the other windows are stored in those windows.
|
||
|
||
@item
|
||
As long as the selected window displays the current buffer, the window's
|
||
point and the buffer's point always move together; they remain equal.
|
||
@end itemize
|
||
|
||
@cindex cursor
|
||
Emacs displays the cursor, by default as a rectangular block, in
|
||
each window at the position of that window's point. When the user
|
||
switches to another buffer in a window, Emacs moves that window's
|
||
cursor to where point is in that buffer. If the exact position of
|
||
point is hidden behind some display element, such as a display string
|
||
or an image, Emacs displays the cursor immediately before or after
|
||
that display element.
|
||
|
||
@defun window-point &optional window
|
||
This function returns the current position of point in @var{window}.
|
||
For a nonselected window, this is the value point would have (in that
|
||
window's buffer) if that window were selected. The default for
|
||
@var{window} is the selected window.
|
||
|
||
When @var{window} is the selected window, the value returned is the
|
||
value of point in that window's buffer. Strictly speaking, it would be
|
||
more correct to return the top-level value of point, outside of any
|
||
@code{save-excursion} forms. But that value is hard to find.
|
||
@end defun
|
||
|
||
@defun set-window-point window position
|
||
This function positions point in @var{window} at position
|
||
@var{position} in @var{window}'s buffer. It returns @var{position}.
|
||
|
||
If @var{window} is selected, this simply does @code{goto-char} in
|
||
@var{window}'s buffer.
|
||
@end defun
|
||
|
||
@defvar window-point-insertion-type
|
||
This variable specifies the marker insertion type (@pxref{Marker
|
||
Insertion Types}) of @code{window-point}. The default is @code{nil},
|
||
so @code{window-point} will stay behind text inserted there.
|
||
@end defvar
|
||
|
||
@defun set-window-cursor-type window type
|
||
This function sets the cursor shape for @var{window}. This setting
|
||
takes precedence over the @code{cursor-type} variable, and @var{type}
|
||
has the same format as the value of that variable. @xref{Cursor
|
||
Parameters}. If @var{window} is @code{nil}, it means to set the cursor
|
||
type for the selected window.
|
||
|
||
The initial value for new windows is @code{t}, which says to respect the
|
||
buffer-local value of @code{cursor-type}. The value set by this
|
||
function persists across buffers shown in @var{window}, so
|
||
@code{set-window-buffer} does not reset it. @xref{Buffers and Windows}.
|
||
@end defun
|
||
|
||
@defun window-cursor-type &optional window
|
||
This function returns the cursor type of @var{window}, defaulting to the
|
||
selected window.
|
||
@end defun
|
||
|
||
@node Window Start and End
|
||
@section The Window Start and End Positions
|
||
@cindex window start position
|
||
@cindex display-start position
|
||
|
||
Each window maintains a marker used to keep track of a buffer position
|
||
that specifies where in the buffer display should start. This position
|
||
is called the @dfn{display-start} position of the window (or just the
|
||
@dfn{start}). The character after this position is the one that appears
|
||
at the upper left corner of the window. It is usually, but not
|
||
inevitably, at the beginning of a text line.
|
||
|
||
After switching windows or buffers, and in some other cases, if the
|
||
window start is in the middle of a line, Emacs adjusts the window
|
||
start to the start of a line. This prevents certain operations from
|
||
leaving the window start at a meaningless point within a line. This
|
||
feature may interfere with testing some Lisp code by executing it
|
||
using the commands of Lisp mode, because they trigger this
|
||
readjustment. To test such code, put it into a command and bind the
|
||
command to a key.
|
||
|
||
@defun window-start &optional window
|
||
@cindex window top line
|
||
This function returns the display-start position of window
|
||
@var{window}. If @var{window} is @code{nil}, the selected window is
|
||
used.
|
||
|
||
When you create a window, or display a different buffer in it, the
|
||
display-start position is set to a display-start position recently used
|
||
for the same buffer, or to @code{point-min} if the buffer doesn't have
|
||
any.
|
||
|
||
Redisplay updates the window-start position (if you have not specified
|
||
it explicitly since the previous redisplay)---to make sure point appears
|
||
on the screen. Nothing except redisplay automatically changes the
|
||
window-start position; if you move point, do not expect the window-start
|
||
position to change in response until after the next redisplay.
|
||
@end defun
|
||
|
||
@defun window-group-start &optional window
|
||
@vindex window-group-start-function
|
||
This function is like @code{window-start}, except that when
|
||
@var{window} is a part of a group of windows (@pxref{Window Group}),
|
||
@code{window-group-start} returns the start position of the entire
|
||
group. This condition holds when the buffer local variable
|
||
@code{window-group-start-function} is set to a function. In this
|
||
case, @code{window-group-start} calls the function with the single
|
||
argument @var{window}, then returns its result.
|
||
@end defun
|
||
|
||
@cindex window end position
|
||
@cindex last visible position in a window
|
||
@defun window-end &optional window update
|
||
This function returns the position where display of its buffer ends in
|
||
@var{window}. The default for @var{window} is the selected window.
|
||
|
||
Simply changing the buffer text or moving point does not update the
|
||
value that @code{window-end} returns. The value is updated only when
|
||
Emacs redisplays and redisplay completes without being preempted.
|
||
|
||
If the last redisplay of @var{window} was preempted, and did not finish,
|
||
Emacs does not know the position of the end of display in that window.
|
||
In that case, this function returns @code{nil}.
|
||
|
||
If @var{update} is non-@code{nil}, @code{window-end} always returns an
|
||
up-to-date value for where display ends, based on the current
|
||
@code{window-start} value. If a previously saved value of that position
|
||
is still valid, @code{window-end} returns that value; otherwise it
|
||
computes the correct value by scanning the buffer text.
|
||
|
||
Even if @var{update} is non-@code{nil}, @code{window-end} does not
|
||
attempt to scroll the display if point has moved off the screen, the
|
||
way real redisplay would do. It does not alter the
|
||
@code{window-start} value. In effect, it reports where the displayed
|
||
text will end if scrolling is not required. Note that the position it
|
||
returns might be only partially visible.
|
||
@end defun
|
||
|
||
@vindex window-group-end-function
|
||
@defun window-group-end &optional window update
|
||
This function is like @code{window-end}, except that when @var{window}
|
||
is a part of a group of windows (@pxref{Window Group}),
|
||
@code{window-group-end} returns the end position of the entire group.
|
||
This condition holds when the buffer local variable
|
||
@code{window-group-end-function} is set to a function. In this case,
|
||
@code{window-group-end} calls the function with the two arguments
|
||
@var{window} and @var{update}, then returns its result. The argument
|
||
@var{update} has the same meaning as in @code{window-end}.
|
||
@end defun
|
||
|
||
@defun set-window-start window position &optional noforce
|
||
This function sets the display-start position of @var{window} to
|
||
@var{position} in @var{window}'s buffer. It returns @var{position}.
|
||
|
||
The display routines insist that the position of point be visible when a
|
||
buffer is displayed. Normally, they select the display-start position
|
||
according to their internal logic (and scroll the window if necessary)
|
||
to make point visible. However, if you specify the start position
|
||
with this function using @code{nil} for @var{noforce}, it means you
|
||
want display to start at @var{position} even if that would put the
|
||
location of point off the screen. If this does place point off
|
||
screen, the display routines attempt to move point to the left margin
|
||
on the middle line in the window.
|
||
|
||
For example, if point @w{is 1} and you set the start of the window
|
||
@w{to 37}, the start of the next line, point will be above the top
|
||
of the window. The display routines will automatically move point if
|
||
it is still 1 when redisplay occurs. Here is an example:
|
||
|
||
@example
|
||
@group
|
||
;; @r{Here is what @samp{foo} looks like before executing}
|
||
;; @r{the @code{set-window-start} expression.}
|
||
@end group
|
||
|
||
@group
|
||
---------- Buffer: foo ----------
|
||
@point{}This is the contents of buffer foo.
|
||
2
|
||
3
|
||
4
|
||
5
|
||
6
|
||
---------- Buffer: foo ----------
|
||
@end group
|
||
|
||
@group
|
||
(set-window-start
|
||
(selected-window)
|
||
(save-excursion
|
||
(goto-char 1)
|
||
(forward-line 1)
|
||
(point)))
|
||
@result{} 37
|
||
@end group
|
||
|
||
@group
|
||
;; @r{Here is what @samp{foo} looks like after executing}
|
||
;; @r{the @code{set-window-start} expression.}
|
||
---------- Buffer: foo ----------
|
||
2
|
||
3
|
||
@point{}4
|
||
5
|
||
6
|
||
---------- Buffer: foo ----------
|
||
@end group
|
||
@end example
|
||
|
||
If the attempt to make point visible (i.e., in a fully-visible screen
|
||
line) fails, the display routines will disregard the requested
|
||
window-start position and compute a new one anyway. Thus, for
|
||
reliable results Lisp programs that call this function should always
|
||
move point to be inside the window whose display starts at
|
||
@var{position}.
|
||
|
||
If @var{noforce} is non-@code{nil}, and @var{position} would place point
|
||
off screen at the next redisplay, then redisplay computes a new window-start
|
||
position that works well with point, and thus @var{position} is not used.
|
||
@end defun
|
||
|
||
@vindex set-window-group-start-function
|
||
@defun set-window-group-start window position &optional noforce
|
||
This function is like @code{set-window-start}, except that when
|
||
@var{window} is a part of a group of windows (@pxref{Window Group}),
|
||
@code{set-window-group-start} sets the start position of the entire
|
||
group. This condition holds when the buffer local variable
|
||
@code{set-window-group-start-function} is set to a function. In this
|
||
case, @code{set-window-group-start} calls the function with the three
|
||
arguments @var{window}, @var{position}, and @var{noforce}, then
|
||
returns its result. The arguments @var{position} and @var{noforce} in
|
||
this function have the same meaning as in @code{set-window-start}.
|
||
@end defun
|
||
|
||
@defun pos-visible-in-window-p &optional position window partially
|
||
This function returns non-@code{nil} if @var{position} is within the
|
||
range of text currently visible on the screen in @var{window}. It
|
||
returns @code{nil} if @var{position} is scrolled vertically out of
|
||
view. Locations that are partially obscured are not considered
|
||
visible unless @var{partially} is non-@code{nil}. The argument
|
||
@var{position} defaults to the current position of point in
|
||
@var{window}; @var{window} defaults to the selected window. If
|
||
@var{position} is @code{t}, that means to check either the first
|
||
visible position of the last screen line in @var{window}, or the
|
||
end-of-buffer position, whichever comes first.
|
||
|
||
This function considers only vertical scrolling. If @var{position} is
|
||
out of view only because @var{window} has been scrolled horizontally,
|
||
@code{pos-visible-in-window-p} returns non-@code{nil} anyway.
|
||
@xref{Horizontal Scrolling}.
|
||
|
||
If @var{position} is visible, @code{pos-visible-in-window-p} returns
|
||
@code{t} if @var{partially} is @code{nil}; if @var{partially} is
|
||
non-@code{nil}, and the character following @var{position} is fully
|
||
visible, it returns a list of the form @code{(@var{x} @var{y})}, where
|
||
@var{x} and @var{y} are the pixel coordinates relative to the top left
|
||
corner of the window; otherwise it returns an extended list of the form
|
||
@code{(@var{x} @var{y} @var{rtop} @var{rbot} @var{rowh} @var{vpos})},
|
||
where @var{rtop} and @var{rbot} specify the number of off-window pixels
|
||
at the top and bottom of the row at @var{position}, @var{rowh} specifies
|
||
the visible height of that row, and @var{vpos} specifies the vertical
|
||
position (zero-based row number) of that row.
|
||
|
||
Here is an example:
|
||
|
||
@example
|
||
@group
|
||
;; @r{If point is off the screen now, recenter it now.}
|
||
(or (pos-visible-in-window-p
|
||
(point) (selected-window))
|
||
(recenter 0))
|
||
@end group
|
||
@end example
|
||
@end defun
|
||
|
||
@vindex pos-visible-in-window-group-p-function
|
||
@defun pos-visible-in-window-group-p &optional position window partially
|
||
This function is like @code{pos-visible-in-window-p}, except that when
|
||
@var{window} is a part of a group of windows (@pxref{Window Group}),
|
||
@code{pos-visible-in-window-group-p} tests the visibility of @var{pos}
|
||
in the entire group, not just in the single @var{window}. This
|
||
condition holds when the buffer local variable
|
||
@code{pos-visible-in-window-group-p-function} is set to a function.
|
||
In this case @code{pos-visible-in-window-group-p} calls the function
|
||
with the three arguments @var{position}, @var{window}, and
|
||
@var{partially}, then returns its result. The arguments
|
||
@var{position} and @var{partially} have the same meaning as in
|
||
@code{pos-visible-in-window-p}.
|
||
@end defun
|
||
|
||
@defun window-line-height &optional line window
|
||
This function returns the height of text line @var{line} in
|
||
@var{window}. If @var{line} is one of @code{header-line} or
|
||
@code{mode-line}, @code{window-line-height} returns information about
|
||
the corresponding line of the window. Otherwise, @var{line} is a text
|
||
line number starting from 0. A negative number counts from the end of
|
||
the window. The default for @var{line} is the current line in
|
||
@var{window}; the default for @var{window} is the selected window.
|
||
|
||
If the display is not up to date, @code{window-line-height} returns
|
||
@code{nil}. In that case, @code{pos-visible-in-window-p} may be used
|
||
to obtain related information.
|
||
|
||
If there is no line corresponding to the specified @var{line},
|
||
@code{window-line-height} returns @code{nil}. Otherwise, it returns
|
||
a list @code{(@var{height} @var{vpos} @var{ypos} @var{offbot})},
|
||
where @var{height} is the height in pixels of the visible part of the
|
||
line, @var{vpos} and @var{ypos} are the vertical position in lines and
|
||
pixels of the line relative to the top of the first text line, and
|
||
@var{offbot} is the number of off-window pixels at the bottom of the
|
||
text line. If there are off-window pixels at the top of the (first)
|
||
text line, @var{ypos} is negative.
|
||
@end defun
|
||
|
||
@node Textual Scrolling
|
||
@section Textual Scrolling
|
||
@cindex textual scrolling
|
||
@cindex scrolling textually
|
||
|
||
@dfn{Textual scrolling} means moving the text up or down through a
|
||
window. It works by changing the window's display-start location. It
|
||
may also change the value of @code{window-point} to keep point on the
|
||
screen (@pxref{Window Point}).
|
||
|
||
The basic textual scrolling functions are @code{scroll-up} (which
|
||
scrolls forward) and @code{scroll-down} (which scrolls backward). In
|
||
these function names, ``up'' and ``down'' refer to the direction of
|
||
motion of the buffer text relative to the window. Imagine that the
|
||
text is written on a long roll of paper and that the scrolling
|
||
commands move the paper up and down. Thus, if you are looking at the
|
||
middle of a buffer and repeatedly call @code{scroll-down}, you will
|
||
eventually see the beginning of the buffer.
|
||
|
||
Unfortunately, this sometimes causes confusion, because some people
|
||
tend to think in terms of the opposite convention: they
|
||
imagine the window moving over text that remains in place, so that
|
||
``down'' commands take you to the end of the buffer. This convention
|
||
is consistent with fact that such a command is bound to a key named
|
||
@key{PageDown} on modern keyboards.
|
||
@ignore
|
||
We have not switched to this convention as that is likely to break
|
||
existing Emacs Lisp code.
|
||
@end ignore
|
||
|
||
Textual scrolling functions (aside from @code{scroll-other-window})
|
||
have unpredictable results if the current buffer is not the one
|
||
displayed in the selected window. @xref{Current Buffer}.
|
||
|
||
If the window contains a row taller than the height of the window
|
||
(for example in the presence of a large image), the scroll functions
|
||
will adjust the window's vertical scroll position to scroll the
|
||
partially visible row. Lisp callers can disable this feature by
|
||
binding the variable @code{auto-window-vscroll} to @code{nil}
|
||
(@pxref{Vertical Scrolling}).
|
||
|
||
@deffn Command scroll-up &optional count
|
||
This function scrolls forward by @var{count} lines in the selected
|
||
window.
|
||
|
||
If @var{count} is negative, it scrolls backward instead. If
|
||
@var{count} is @code{nil} (or omitted), the distance scrolled is
|
||
@code{next-screen-context-lines} lines less than the height of the
|
||
window's body.
|
||
|
||
If the selected window cannot be scrolled any further, this function
|
||
signals an error. Otherwise, it returns @code{nil}.
|
||
@end deffn
|
||
|
||
@deffn Command scroll-down &optional count
|
||
This function scrolls backward by @var{count} lines in the selected
|
||
window.
|
||
|
||
If @var{count} is negative, it scrolls forward instead. In other
|
||
respects, it behaves the same way as @code{scroll-up} does.
|
||
@end deffn
|
||
|
||
@deffn Command scroll-up-command &optional count
|
||
This behaves like @code{scroll-up}, except that if the selected window
|
||
cannot be scrolled any further and the value of the variable
|
||
@code{scroll-error-top-bottom} is @code{t}, it tries to move to the
|
||
end of the buffer instead. If point is already there, it signals an
|
||
error.
|
||
@end deffn
|
||
|
||
@deffn Command scroll-down-command &optional count
|
||
This behaves like @code{scroll-down}, except that if the selected
|
||
window cannot be scrolled any further and the value of the variable
|
||
@code{scroll-error-top-bottom} is @code{t}, it tries to move to the
|
||
beginning of the buffer instead. If point is already there, it
|
||
signals an error.
|
||
@end deffn
|
||
|
||
@deffn Command scroll-other-window &optional count
|
||
This function scrolls the text in another window upward @var{count}
|
||
lines. Negative values of @var{count}, or @code{nil}, are handled
|
||
as in @code{scroll-up}.
|
||
|
||
You can specify which buffer to scroll by setting the variable
|
||
@code{other-window-scroll-buffer} to a buffer. If that buffer isn't
|
||
already displayed, @code{scroll-other-window} displays it in some
|
||
window.
|
||
|
||
When the selected window is the minibuffer, the next window is normally
|
||
the leftmost one immediately above it. You can specify a different
|
||
window to scroll, when the minibuffer is selected, by setting the variable
|
||
@code{minibuffer-scroll-window}. This variable has no effect when any
|
||
other window is selected. When it is non-@code{nil} and the
|
||
minibuffer is selected, it takes precedence over
|
||
@code{other-window-scroll-buffer}. @xref{Definition of
|
||
minibuffer-scroll-window}.
|
||
@end deffn
|
||
|
||
@deffn Command scroll-other-window-down &optional count
|
||
This function scrolls the text in another window downward @var{count}
|
||
lines. Negative values of @var{count}, or @code{nil}, are handled as
|
||
in @code{scroll-down}. In other respects, it behaves the same way as
|
||
@code{scroll-other-window} does.
|
||
@end deffn
|
||
|
||
@defvar other-window-scroll-buffer
|
||
If this variable is non-@code{nil}, it tells @code{scroll-other-window}
|
||
which buffer's window to scroll.
|
||
@end defvar
|
||
|
||
@defopt scroll-margin
|
||
This option specifies the size of the scroll margin---a minimum number
|
||
of lines between point and the top or bottom of a window. Whenever
|
||
point gets within this many lines of the top or bottom of the window,
|
||
redisplay scrolls the text automatically (if possible) to move point
|
||
out of the margin, closer to the center of the window.
|
||
@end defopt
|
||
|
||
@defopt maximum-scroll-margin
|
||
This variable limits the effective value of @code{scroll-margin} to a
|
||
fraction of the current window line height. For example, if the
|
||
current window has 20 lines and @code{maximum-scroll-margin} is 0.1,
|
||
then the scroll margins will never be larger than 2 lines, no matter
|
||
how big @code{scroll-margin} is.
|
||
|
||
@code{maximum-scroll-margin} itself has a maximum value of 0.5, which
|
||
allows setting margins large to keep the cursor at the middle line of
|
||
the window (or two middle lines if the window has an even number of
|
||
lines). If it's set to a larger value (or any value other than a
|
||
float between 0.0 and 0.5) then the default value of 0.25 will be used
|
||
instead.
|
||
@end defopt
|
||
|
||
@defopt scroll-conservatively
|
||
This variable controls how scrolling is done automatically when point
|
||
moves off the screen (or into the scroll margin). If the value is a
|
||
positive integer @var{n}, then redisplay scrolls the text up to
|
||
@var{n} lines in either direction, if that will bring point back into
|
||
proper view. This behavior is called @dfn{conservative scrolling}.
|
||
Otherwise, scrolling happens in the usual way, under the control of
|
||
other variables such as @code{scroll-up-aggressively} and
|
||
@code{scroll-down-aggressively}.
|
||
|
||
The default value is zero, which means that conservative scrolling
|
||
never happens.
|
||
@end defopt
|
||
|
||
@defopt scroll-down-aggressively
|
||
The value of this variable should be either @code{nil} or a fraction
|
||
@var{f} between 0 and 1. If it is a fraction, that specifies where on
|
||
the screen to put point when scrolling down. More precisely, when a
|
||
window scrolls down because point is above the window start, the new
|
||
start position is chosen to put point @var{f} part of the window
|
||
height from the top. The larger @var{f}, the more aggressive the
|
||
scrolling.
|
||
|
||
A value of @code{nil} is equivalent to .5, since its effect is to center
|
||
point. This variable automatically becomes buffer-local when set in any
|
||
fashion.
|
||
@end defopt
|
||
|
||
@defopt scroll-up-aggressively
|
||
Likewise, for scrolling up. The value, @var{f}, specifies how far
|
||
point should be placed from the bottom of the window; thus, as with
|
||
@code{scroll-down-aggressively}, a larger value scrolls more
|
||
aggressively.
|
||
@end defopt
|
||
|
||
@defopt scroll-step
|
||
This variable is an older variant of @code{scroll-conservatively}.
|
||
The difference is that if its value is @var{n}, that permits scrolling
|
||
only by precisely @var{n} lines, not a smaller number. This feature
|
||
does not work with @code{scroll-margin}. The default value is zero.
|
||
@end defopt
|
||
|
||
@cindex @code{scroll-command} property
|
||
@defopt scroll-preserve-screen-position
|
||
If this option is @code{t}, whenever a scrolling command moves point
|
||
off-window, Emacs tries to adjust point to keep the cursor at its old
|
||
vertical position in the window, rather than the window edge.
|
||
|
||
If the value is non-@code{nil} and not @code{t}, Emacs adjusts point
|
||
to keep the cursor at the same vertical position, even if the
|
||
scrolling command didn't move point off-window.
|
||
|
||
This option affects all scroll commands that have a non-@code{nil}
|
||
@code{scroll-command} symbol property.
|
||
@end defopt
|
||
|
||
@defopt next-screen-context-lines
|
||
The value of this variable is the number of lines of continuity to
|
||
retain when scrolling by full screens. For example, @code{scroll-up}
|
||
with an argument of @code{nil} scrolls so that this many lines at the
|
||
bottom of the window appear instead at the top. The default value is
|
||
@code{2}.
|
||
@end defopt
|
||
|
||
@defopt scroll-error-top-bottom
|
||
If this option is @code{nil} (the default), @code{scroll-up-command}
|
||
and @code{scroll-down-command} simply signal an error when no more
|
||
scrolling is possible.
|
||
|
||
If the value is @code{t}, these commands instead move point to the
|
||
beginning or end of the buffer (depending on scrolling direction);
|
||
only if point is already on that position do they signal an error.
|
||
@end defopt
|
||
|
||
@deffn Command recenter &optional count redisplay
|
||
@cindex centering point
|
||
This function scrolls the text in the selected window so that point is
|
||
displayed at a specified vertical position within the window. It does
|
||
not move point with respect to the text.
|
||
|
||
If @var{count} is a non-negative number, that puts the line containing
|
||
point @var{count} lines down from the top of the window. If
|
||
@var{count} is a negative number, then it counts upward from the
|
||
bottom of the window, so that @minus{}1 stands for the last usable
|
||
line in the window.
|
||
|
||
If @var{count} is @code{nil} (or a non-@code{nil} list),
|
||
@code{recenter} puts the line containing point in the middle of the
|
||
window. If @var{count} is @code{nil} and @var{redisplay} is
|
||
non-@code{nil}, this function may redraw the frame, according to the
|
||
value of @code{recenter-redisplay}. Thus, omitting the second
|
||
argument can be used to countermand the effect of
|
||
@code{recenter-redisplay} being non-@code{nil}. Interactive calls
|
||
pass non-@code{nil} for @var{redisplay}.
|
||
|
||
When @code{recenter} is called interactively, @var{count} is the raw
|
||
prefix argument. Thus, typing @kbd{C-u} as the prefix sets the
|
||
@var{count} to a non-@code{nil} list, while typing @kbd{C-u 4} sets
|
||
@var{count} to 4, which positions the current line four lines from the
|
||
top.
|
||
|
||
With an argument of zero, @code{recenter} positions the current line at
|
||
the top of the window. The command @code{recenter-top-bottom} offers
|
||
a more convenient way to achieve this.
|
||
@end deffn
|
||
|
||
@vindex recenter-window-group-function
|
||
@defun recenter-window-group &optional count
|
||
This function is like @code{recenter}, except that when the selected
|
||
window is part of a group of windows (@pxref{Window Group}),
|
||
@code{recenter-window-group} scrolls the entire group. This condition
|
||
holds when the buffer local variable
|
||
@code{recenter-window-group-function} is set to a function. In this
|
||
case, @code{recenter-window-group} calls the function with the
|
||
argument @var{count}, then returns its result. The argument
|
||
@var{count} has the same meaning as in @code{recenter}, but with
|
||
respect to the entire window group.
|
||
@end defun
|
||
|
||
@defopt recenter-redisplay
|
||
If this variable is non-@code{nil}, calling @code{recenter} with a
|
||
@code{nil} @var{count} argument and non-@code{nil} @var{redisplay}
|
||
argument redraws the frame. The default value is @code{tty}, which
|
||
means only redraw the frame if it is a tty frame.
|
||
@end defopt
|
||
|
||
@deffn Command recenter-top-bottom &optional count
|
||
This command, which is the default binding for @kbd{C-l}, acts like
|
||
@code{recenter}, except if called with no argument. In that case,
|
||
successive calls place point according to the cycling order defined
|
||
by the variable @code{recenter-positions}.
|
||
@end deffn
|
||
|
||
@defopt recenter-positions
|
||
This variable controls how @code{recenter-top-bottom} behaves when
|
||
called with no argument. The default value is @code{(middle top
|
||
bottom)}, which means that successive calls of
|
||
@code{recenter-top-bottom} with no argument cycle between placing
|
||
point at the middle, top, and bottom of the window.
|
||
@end defopt
|
||
|
||
|
||
@node Vertical Scrolling
|
||
@section Vertical Fractional Scrolling
|
||
@cindex vertical fractional scrolling
|
||
@cindex vertical scroll position
|
||
|
||
@dfn{Vertical fractional scrolling} means shifting text in a window
|
||
up or down by a specified multiple or fraction of a line. Emacs uses
|
||
it, for example, on images and screen lines which are taller than the
|
||
window. Each window has a @dfn{vertical scroll position}, which is a
|
||
number, never less than zero. It specifies how far to raise the
|
||
contents of the window when displaying them. Raising the window
|
||
contents generally makes all or part of some lines disappear off the
|
||
top, and all or part of some other lines appear at the bottom. The
|
||
usual value is zero.
|
||
|
||
The vertical scroll position is measured in units of the normal line
|
||
height, which is the height of the default font. Thus, if the value is
|
||
.5, that means the window contents will be scrolled up half the normal
|
||
line height. If it is 3.3, that means the window contents are scrolled
|
||
up somewhat over three times the normal line height.
|
||
|
||
What fraction of a line the vertical scrolling covers, or how many
|
||
lines, depends on what the lines contain. A value of .5 could scroll a
|
||
line whose height is very short off the screen, while a value of 3.3
|
||
could scroll just part of the way through a tall line or an image.
|
||
|
||
@defun window-vscroll &optional window pixels-p
|
||
This function returns the current vertical scroll position of
|
||
@var{window}. The default for @var{window} is the selected window.
|
||
If @var{pixels-p} is non-@code{nil}, the return value is measured in
|
||
pixels, rather than in units of the normal line height.
|
||
|
||
@example
|
||
@group
|
||
(window-vscroll)
|
||
@result{} 0
|
||
@end group
|
||
@end example
|
||
@end defun
|
||
|
||
@defun set-window-vscroll window lines &optional pixels-p preserve-vscroll-p
|
||
This function sets @var{window}'s vertical scroll position to
|
||
@var{lines}. If @var{window} is @code{nil}, the selected window is
|
||
used. The argument @var{lines} should be zero or positive; if not, it
|
||
is taken as zero.
|
||
|
||
|
||
The actual vertical scroll position must always correspond
|
||
to an integral number of pixels, so the value you specify
|
||
is rounded accordingly.
|
||
|
||
The return value is the result of this rounding.
|
||
|
||
@example
|
||
@group
|
||
(set-window-vscroll (selected-window) 1.2)
|
||
@result{} 1.13
|
||
@end group
|
||
@end example
|
||
|
||
If @var{pixels-p} is non-@code{nil}, @var{lines} specifies a number of
|
||
pixels. In this case, the return value is @var{lines}.
|
||
|
||
Normally, the vscroll does not take effect on windows that aren't the
|
||
@code{minibuffer-scroll-window} or the selected window when the
|
||
mini-window is resized (@pxref{Minibuffer Windows}). This ``frozen''
|
||
behavior is disabled when the @var{preserve-vscroll-p} parameter is
|
||
non-@code{nil}, which means to set the vscroll as usual.
|
||
@end defun
|
||
|
||
@defvar auto-window-vscroll
|
||
If this variable is non-@code{nil}, the @code{line-move},
|
||
@code{scroll-up}, and @code{scroll-down} functions will automatically
|
||
modify the vertical scroll position to scroll through display rows
|
||
that are taller than the height of the window, for example in the
|
||
presence of large images.
|
||
@end defvar
|
||
|
||
@node Horizontal Scrolling
|
||
@section Horizontal Scrolling
|
||
@cindex horizontal scrolling
|
||
|
||
@dfn{Horizontal scrolling} means shifting the image in the window left
|
||
or right by a specified multiple of the normal character width. Each
|
||
window has a @dfn{horizontal scroll position}, which is a number, never
|
||
less than zero. It specifies how far to shift the contents left.
|
||
Shifting the window contents left generally makes all or part of some
|
||
characters disappear off the left, and all or part of some other
|
||
characters appear at the right. The usual value is zero.
|
||
|
||
The horizontal scroll position is measured in units of the normal
|
||
character width, which is the width of space in the default font. Thus,
|
||
if the value is 5, that means the window contents are scrolled left by 5
|
||
times the normal character width. How many characters actually
|
||
disappear off to the left depends on their width, and could vary from
|
||
line to line.
|
||
|
||
Because we read from side to side in the inner loop, and from top
|
||
to bottom in the outer loop, the effect of horizontal scrolling is
|
||
not like that of textual or vertical scrolling. Textual scrolling
|
||
involves selection of a portion of text to display, and vertical
|
||
scrolling moves the window contents contiguously; but horizontal
|
||
scrolling causes part of @emph{each line} to go off screen.
|
||
|
||
Usually, no horizontal scrolling is in effect; then the leftmost
|
||
column is at the left edge of the window. In this state, scrolling to
|
||
the right is meaningless, since there is no data to the left of the edge
|
||
to be revealed by it; so this is not allowed. Scrolling to the left is
|
||
allowed; it scrolls the first columns of text off the edge of the window
|
||
and can reveal additional columns on the right that were truncated
|
||
before. Once a window has a nonzero amount of leftward horizontal
|
||
scrolling, you can scroll it back to the right, but only so far as to
|
||
reduce the net horizontal scroll to zero. There is no limit to how far
|
||
left you can scroll, but eventually all the text will disappear off the
|
||
left edge.
|
||
|
||
@vindex auto-hscroll-mode
|
||
If @code{auto-hscroll-mode} is set, redisplay automatically alters
|
||
the horizontal scrolling of a window as necessary to ensure that point
|
||
is always visible. However, you can still set the horizontal
|
||
scrolling value explicitly. The value you specify serves as a lower
|
||
bound for automatic scrolling, i.e., automatic scrolling will not
|
||
scroll a window to a column less than the specified one.
|
||
|
||
The default value of @code{auto-hscroll-mode} is @code{t}; setting
|
||
it to @code{current-line} activates a variant of automatic horizontal
|
||
scrolling whereby only the line showing the cursor is horizontally
|
||
scrolled to make point visible, the rest of the window is left either
|
||
unscrolled, or at the minimum scroll amount set by @code{scroll-left}
|
||
and @code{scroll-right}, see below.
|
||
|
||
@deffn Command scroll-left &optional count set-minimum
|
||
This function scrolls the selected window @var{count} columns to the
|
||
left (or to the right if @var{count} is negative). The default
|
||
for @var{count} is the window width, minus 2.
|
||
|
||
The return value is the total amount of leftward horizontal scrolling in
|
||
effect after the change---just like the value returned by
|
||
@code{window-hscroll} (below).
|
||
|
||
Note that text in paragraphs whose base direction is right-to-left
|
||
(@pxref{Bidirectional Display}) moves in the opposite direction: e.g.,
|
||
it moves to the right when @code{scroll-left} is invoked with a
|
||
positive value of @var{count}.
|
||
|
||
Once you scroll a window as far right as it can go, back to its normal
|
||
position where the total leftward scrolling is zero, attempts to scroll
|
||
any farther right have no effect.
|
||
|
||
If @var{set-minimum} is non-@code{nil}, the new scroll amount becomes
|
||
the lower bound for automatic scrolling; that is, automatic scrolling
|
||
will not scroll a window to a column less than the value returned by
|
||
this function. Interactive calls pass non-@code{nil} for
|
||
@var{set-minimum}.
|
||
@end deffn
|
||
|
||
@deffn Command scroll-right &optional count set-minimum
|
||
This function scrolls the selected window @var{count} columns to the
|
||
right (or to the left if @var{count} is negative). The default
|
||
for @var{count} is the window width, minus 2. Aside from the direction
|
||
of scrolling, this works just like @code{scroll-left}.
|
||
@end deffn
|
||
|
||
@defun window-hscroll &optional window
|
||
This function returns the total leftward horizontal scrolling of
|
||
@var{window}---the number of columns by which the text in @var{window}
|
||
is scrolled left past the left margin. (In right-to-left paragraphs,
|
||
the value is the total amount of the rightward scrolling instead.)
|
||
The default for @var{window} is the selected window.
|
||
|
||
The return value is never negative. It is zero when no horizontal
|
||
scrolling has been done in @var{window} (which is usually the case).
|
||
|
||
|
||
@example
|
||
@group
|
||
(window-hscroll)
|
||
@result{} 0
|
||
@end group
|
||
@group
|
||
(scroll-left 5)
|
||
@result{} 5
|
||
@end group
|
||
@group
|
||
(window-hscroll)
|
||
@result{} 5
|
||
@end group
|
||
@end example
|
||
@end defun
|
||
|
||
@defun set-window-hscroll window columns
|
||
This function sets horizontal scrolling of @var{window}. The value of
|
||
@var{columns} specifies the amount of scrolling, in terms of columns
|
||
from the left margin (right margin in right-to-left paragraphs). The
|
||
argument @var{columns} should be zero or positive; if not, it is taken
|
||
as zero. Fractional values of @var{columns} are not supported at
|
||
present.
|
||
|
||
Note that @code{set-window-hscroll} may appear not to work if you test
|
||
it by evaluating a call with @kbd{M-:} in a simple way. What happens
|
||
is that the function sets the horizontal scroll value and returns, but
|
||
then redisplay adjusts the horizontal scrolling to make point visible,
|
||
and this overrides what the function did. You can observe the
|
||
function's effect if you call it while point is sufficiently far from
|
||
the left margin that it will remain visible.
|
||
|
||
The value returned is @var{columns}.
|
||
|
||
@example
|
||
@group
|
||
(set-window-hscroll (selected-window) 10)
|
||
@result{} 10
|
||
@end group
|
||
@end example
|
||
@end defun
|
||
|
||
Here is how you can determine whether a given position @var{position}
|
||
is off the screen due to horizontal scrolling:
|
||
|
||
@c FIXME: Maybe hscroll-on-screen-p is a better name?
|
||
@example
|
||
@group
|
||
(defun hscroll-on-screen (window position)
|
||
(save-excursion
|
||
(goto-char position)
|
||
(and
|
||
(>= (- (current-column) (window-hscroll window)) 0)
|
||
(< (- (current-column) (window-hscroll window))
|
||
(window-width window)))))
|
||
@end group
|
||
@end example
|
||
|
||
|
||
@node Coordinates and Windows
|
||
@section Coordinates and Windows
|
||
@cindex frame-relative coordinate
|
||
@cindex coordinate, relative to frame
|
||
@cindex window position
|
||
|
||
This section describes functions that report positions of and within a
|
||
window. Most of these functions report positions relative to an origin
|
||
at the native position of the window's frame (@pxref{Frame Geometry}).
|
||
Some functions report positions relative to the origin of the display of
|
||
the window's frame. In any case, the origin has the coordinates (0, 0)
|
||
and X and Y coordinates increase rightward and downward respectively.
|
||
|
||
For the following functions, X and Y coordinates are reported in
|
||
integer character units, i.e., numbers of lines and columns
|
||
respectively. On a graphical display, each ``line'' and ``column''
|
||
corresponds to the height and width of the default character specified by
|
||
the frame's default font (@pxref{Frame Font}).
|
||
|
||
@defun window-edges &optional window body absolute pixelwise
|
||
This function returns a list of the edge coordinates of @var{window}.
|
||
If @var{window} is omitted or @code{nil}, it defaults to the selected
|
||
window.
|
||
|
||
The return value has the form @code{(@var{left} @var{top} @var{right}
|
||
@var{bottom})}. These list elements are, respectively, the X
|
||
coordinate of the leftmost column occupied by the window, the Y
|
||
coordinate of the topmost row, the X coordinate one column to the
|
||
right of the rightmost column, and the Y coordinate one row down from
|
||
the bottommost row.
|
||
|
||
Note that these are the actual outer edges of the window, including any
|
||
of its decorations. On a text terminal, if the window has a neighbor on
|
||
its right, its right edge includes the separator line between the window
|
||
and its neighbor.
|
||
|
||
If the optional argument @var{body} is @code{nil}, this means to
|
||
return the edges corresponding to the total size of @var{window}.
|
||
@var{body} non-@code{nil} means to return the edges of @var{window}'s
|
||
body. If @var{body} is non-@code{nil}, @var{window} must specify a
|
||
live window.
|
||
|
||
If the optional argument @var{absolute} is @code{nil}, this means to
|
||
return edges relative to the native position of @var{window}'s frame.
|
||
@var{absolute} non-@code{nil} means to return coordinates relative to
|
||
the origin (0, 0) of @var{window}'s display. On non-graphical systems
|
||
this argument has no effect.
|
||
|
||
If the optional argument @var{pixelwise} is @code{nil}, this means to
|
||
return the coordinates in terms of the default character width and
|
||
height of @var{window}'s frame (@pxref{Frame Font}), rounded if
|
||
necessary. @var{pixelwise} non-@code{nil} means to return the
|
||
coordinates in pixels. Note that the pixel specified by @var{right} and
|
||
@var{bottom} is immediately outside of these edges. If @var{absolute}
|
||
is non-@code{nil}, @var{pixelwise} is implicitly non-@code{nil} too.
|
||
@end defun
|
||
|
||
@defun window-body-edges &optional window
|
||
This function returns the edges of @var{window}'s body (@pxref{Window
|
||
Sizes}). Calling @code{(window-body-edges window)} is equivalent to
|
||
calling @code{(window-edges window t)}, see above.
|
||
@end defun
|
||
|
||
@comment The following two functions are confusing and hardly used.
|
||
@ignore
|
||
@defun window-left-column &optional window
|
||
This function returns the leftmost column of @var{window}. This value
|
||
equals the @var{left} entry in the list returned by @code{(window-edges
|
||
window)} minus the number of columns occupied by the internal border of
|
||
@var{window}'s frame.
|
||
@end defun
|
||
|
||
@defun window-top-line &optional window
|
||
This function returns the topmost row of @var{window}. This value is
|
||
equal to the @var{top} entry in the list returned by @code{(window-edges
|
||
window)} minus the number of lines occupied by the internal border of
|
||
@var{window}'s frame.
|
||
@end defun
|
||
@end ignore
|
||
|
||
The following functions can be used to relate a set of
|
||
frame-relative coordinates to a window:
|
||
|
||
@defun window-at x y &optional frame
|
||
This function returns the live window at the coordinates @var{x} and
|
||
@var{y} given in default character sizes (@pxref{Frame Font}) relative
|
||
to the native position of @var{frame} (@pxref{Frame Geometry}).
|
||
|
||
If there is no window at that position, the return value is @code{nil}.
|
||
If @var{frame} is omitted or @code{nil}, it defaults to the selected
|
||
frame.
|
||
@end defun
|
||
|
||
@defun coordinates-in-window-p coordinates window
|
||
This function checks whether a window @var{window} occupies the frame
|
||
relative coordinates @var{coordinates}, and if so, which part of the
|
||
window that is. @var{window} should be a live window.
|
||
|
||
@var{coordinates} should be a cons cell of the form @code{(@var{x}
|
||
. @var{y})}, where @var{x} and @var{y} are given in default character
|
||
sizes (@pxref{Frame Font}) relative to the native position of
|
||
@var{window}'s frame (@pxref{Frame Geometry}).
|
||
|
||
If there is no window at the specified position, the return value is
|
||
@code{nil} . Otherwise, the return value is one of the following:
|
||
|
||
@table @code
|
||
@item (@var{relx} . @var{rely})
|
||
The coordinates are inside @var{window}. The numbers @var{relx} and
|
||
@var{rely} are the equivalent window-relative coordinates for the
|
||
specified position, counting from 0 at the top left corner of the
|
||
window.
|
||
|
||
@item mode-line
|
||
The coordinates are in the mode line of @var{window}.
|
||
|
||
@item header-line
|
||
The coordinates are in the header line of @var{window}.
|
||
|
||
@item tab-line
|
||
The coordinates are in the tab line of @var{window}.
|
||
|
||
@item right-divider
|
||
The coordinates are in the divider separating @var{window} from a
|
||
window on the right.
|
||
|
||
@item bottom-divider
|
||
The coordinates are in the divider separating @var{window} from a
|
||
window beneath.
|
||
|
||
@item vertical-line
|
||
The coordinates are in the vertical line between @var{window} and its
|
||
neighbor to the right. This value occurs only if the window doesn't
|
||
have a scroll bar; positions in a scroll bar are considered outside the
|
||
window for these purposes.
|
||
|
||
@item left-fringe
|
||
@itemx right-fringe
|
||
The coordinates are in the left or right fringe of the window.
|
||
|
||
@item left-margin
|
||
@itemx right-margin
|
||
The coordinates are in the left or right margin of the window.
|
||
|
||
@item nil
|
||
The coordinates are not in any part of @var{window}.
|
||
@end table
|
||
|
||
The function @code{coordinates-in-window-p} does not require a frame as
|
||
argument because it always uses the frame that @var{window} is on.
|
||
@end defun
|
||
|
||
The following functions return window positions in pixels, rather
|
||
than character units. Though mostly useful on graphical displays,
|
||
they can also be called on text terminals, where the screen area of
|
||
each text character is taken to be one pixel.
|
||
|
||
@defun window-pixel-edges &optional window
|
||
This function returns a list of pixel coordinates for the edges of
|
||
@var{window}. Calling @code{(window-pixel-edges window)} is equivalent
|
||
to calling @code{(window-edges window nil nil t)}, see above.
|
||
@end defun
|
||
|
||
@comment The following two functions are confusing and hardly used.
|
||
@ignore
|
||
@defun window-pixel-left &optional window
|
||
This function returns the left pixel edge of window @var{window}. This
|
||
value equals the @var{left} entry in the list returned by
|
||
@code{(window-pixel-edges window)} minus the number of pixels occupied
|
||
by the internal border of @var{window}'s frame. @var{window} must be a
|
||
valid window and defaults to the selected one.
|
||
@end defun
|
||
|
||
@defun window-pixel-top &optional window
|
||
This function returns the top pixel edge of window @var{window}. This
|
||
value is equal to the @var{top} entry in the list returned by
|
||
@code{(window-pixel-edges window)} minus the number of pixels occupied
|
||
by the internal border of @var{window}'s frame. @var{window} must be a
|
||
valid window and defaults to the selected one.
|
||
@end defun
|
||
@end ignore
|
||
|
||
@defun window-body-pixel-edges &optional window
|
||
This function returns the pixel edges of @var{window}'s body. Calling
|
||
@code{(window-body-pixel-edges window)} is equivalent to calling
|
||
@code{(window-edges window t nil t)}, see above.
|
||
@end defun
|
||
|
||
The following functions return window positions in pixels, relative to
|
||
the origin of the display screen rather than that of the frame:
|
||
|
||
@defun window-absolute-pixel-edges &optional window
|
||
This function returns the pixel coordinates of @var{window} relative to
|
||
an origin at (0, 0) of the display of @var{window}'s frame. Calling
|
||
@code{(window-absolute-pixel-edges)} is equivalent to calling
|
||
@code{(window-edges window nil t t)}, see above.
|
||
@end defun
|
||
|
||
@defun window-absolute-body-pixel-edges &optional window
|
||
This function returns the pixel coordinates of @var{window}'s body
|
||
relative to an origin at (0, 0) of the display of @var{window}'s frame.
|
||
Calling @code{(window-absolute-body-pixel-edges window)} is equivalent
|
||
to calling @code{(window-edges window t t t)}, see above.
|
||
|
||
Combined with @code{set-mouse-absolute-pixel-position}, this function
|
||
can be used to move the mouse pointer to an arbitrary buffer position
|
||
visible in some window:
|
||
|
||
@example
|
||
@group
|
||
(let ((edges (window-absolute-body-pixel-edges))
|
||
(position (pos-visible-in-window-p nil nil t)))
|
||
(set-mouse-absolute-pixel-position
|
||
(+ (nth 0 edges) (nth 0 position))
|
||
(+ (nth 1 edges) (nth 1 position))))
|
||
@end group
|
||
@end example
|
||
|
||
On a graphical terminal this form ``warps'' the mouse cursor to the
|
||
upper left corner of the glyph at the selected window's point. A
|
||
position calculated this way can be also used to show a tooltip window
|
||
there.
|
||
@end defun
|
||
|
||
The following function returns the screen coordinates of a buffer
|
||
position visible in a window:
|
||
|
||
@defun window-absolute-pixel-position &optional position window
|
||
If the buffer position @var{position} is visible in window @var{window},
|
||
this function returns the display coordinates of the upper/left corner
|
||
of the glyph at @var{position}. The return value is a cons of the X-
|
||
and Y-coordinates of that corner, relative to an origin at (0, 0) of
|
||
@var{window}'s display. It returns @code{nil} if @var{position} is not
|
||
visible in @var{window}.
|
||
|
||
@var{window} must be a live window and defaults to the selected
|
||
window. @var{position} defaults to the value of @code{window-point}
|
||
of @var{window}.
|
||
|
||
This means that in order to move the mouse pointer to the position of
|
||
point in the selected window, it's sufficient to write:
|
||
|
||
@example
|
||
@group
|
||
(let ((position (window-absolute-pixel-position)))
|
||
(set-mouse-absolute-pixel-position
|
||
(car position) (cdr position)))
|
||
@end group
|
||
@end example
|
||
@end defun
|
||
|
||
The following function returns the largest rectangle that can be
|
||
inscribed in a window without covering text displayed in that window.
|
||
|
||
@defun window-largest-empty-rectangle &optional window count min-width min-height positions left
|
||
This function calculates the dimensions of the largest empty rectangle
|
||
that can be inscribed in the specified @var{window}'s text area.
|
||
@var{window} must be a live window and defaults to the selected one.
|
||
|
||
The return value is a triple of the width and the start and end
|
||
y-coordinates of the largest rectangle that can be inscribed into the
|
||
empty space (space not displaying any text) of the text area of
|
||
@var{window}. No x-coordinates are returned by this function---any such
|
||
rectangle is assumed to end at the right edge of @var{window}'s text
|
||
area. If no empty space can be found, the return value is @code{nil}.
|
||
|
||
The optional argument @var{count}, if non-@code{nil}, specifies a
|
||
maximum number of rectangles to return. This means that the return
|
||
value is a list of triples specifying rectangles with the largest
|
||
rectangle first. @var{count} can be also a cons cell whose car
|
||
specifies the number of rectangles to return and whose @sc{cdr}, if
|
||
non-@code{nil}, states that all rectangles returned must be disjoint.
|
||
|
||
The optional arguments @var{min-width} and @var{min-height}, if
|
||
non-@code{nil}, specify the minimum width and height of any rectangle
|
||
returned.
|
||
|
||
The optional argument @var{positions}, if non-@code{nil}, is a cons cell
|
||
whose @sc{car} specifies the uppermost and whose @sc{cdr} specifies the
|
||
lowermost pixel position that must be covered by any rectangle returned.
|
||
These positions measure from the start of the text area of @var{window}.
|
||
|
||
The optional argument @var{left}, if non-@code{nil}, means to return
|
||
values suitable for buffers displaying right to left text. In that
|
||
case, any rectangle returned is assumed to start at the left edge of
|
||
@var{window}'s text area.
|
||
|
||
Note that this function has to retrieve the dimensions of each line of
|
||
@var{window}'s glyph matrix via @code{window-lines-pixel-dimensions}
|
||
(@pxref{Size of Displayed Text}). Hence, this function may also return
|
||
@code{nil} when the current glyph matrix of @var{window} is not
|
||
up-to-date.
|
||
@end defun
|
||
|
||
|
||
@node Mouse Window Auto-selection
|
||
@section Mouse Window Auto-selection
|
||
@cindex window auto-selection
|
||
@cindex auto-selection of window
|
||
The following option enables automatically selecting the window under
|
||
the mouse pointer. This accomplishes a policy similar to that of
|
||
window managers that give focus to a frame (and thus trigger its
|
||
subsequent selection) whenever the mouse pointer enters its
|
||
window-system window (@pxref{Input Focus}, @pxref{Focus Events}).
|
||
|
||
@defopt mouse-autoselect-window
|
||
If this variable is non-@code{nil}, Emacs will try to automatically
|
||
select the window under the mouse pointer. The following values are
|
||
meaningful:
|
||
|
||
@table @asis
|
||
@item A positive number
|
||
This specifies a delay in seconds after which auto-selection triggers.
|
||
The window under the mouse pointer is selected after the mouse has
|
||
remained in it for the entire duration of the delay.
|
||
|
||
@item A negative number
|
||
A negative number has a similar effect as a positive number, but selects
|
||
the window under the mouse pointer only after the mouse pointer has
|
||
remained in it for the entire duration of the absolute value of that
|
||
number and in addition has stopped moving.
|
||
|
||
@item Other value
|
||
Any other non-@code{nil} value means to select a window instantaneously
|
||
as soon as the mouse pointer enters it.
|
||
@end table
|
||
|
||
In either case, the mouse pointer must enter the text area of a window in
|
||
order to trigger its selection. Dragging the scroll bar slider or the
|
||
mode line of a window conceptually should not cause its auto-selection.
|
||
|
||
Mouse auto-selection selects the minibuffer window only if it is active,
|
||
and never deselects the active minibuffer window.
|
||
@end defopt
|
||
|
||
Mouse auto-selection can be used to emulate a focus follows mouse policy
|
||
for child frames (@pxref{Child Frames}) which usually are not tracked by
|
||
the window manager. This requires setting the value of
|
||
@code{focus-follows-mouse} (@pxref{Input Focus}) to a non-@code{nil}
|
||
value. If the value of @code{focus-follows-mouse} is @code{auto-raise},
|
||
entering a child frame with the mouse will raise it automatically above
|
||
all other child frames of that frame's parent frame.
|
||
|
||
|
||
@node Window Configurations
|
||
@section Window Configurations
|
||
@cindex window configurations
|
||
@cindex saving window information
|
||
|
||
A @dfn{window configuration} records the entire layout of one
|
||
frame---all windows, their sizes, their decorations, which buffers they
|
||
contain, how those buffers are scrolled, and their value of point, It
|
||
also includes the value of @code{minibuffer-scroll-window}. As a
|
||
special exception, the window configuration does not record the value of
|
||
point in the selected window for the current buffer.
|
||
|
||
You can bring back an entire frame layout by restoring a previously
|
||
saved window configuration. If you want to record the layout of all
|
||
frames instead of just one, use a frame configuration instead of a
|
||
window configuration. @xref{Frame Configurations}.
|
||
|
||
@defun current-window-configuration &optional frame
|
||
This function returns a new object representing @var{frame}'s current
|
||
window configuration. The default for @var{frame} is the selected
|
||
frame. The variable @code{window-persistent-parameters} specifies
|
||
which window parameters (if any) are saved by this function.
|
||
@xref{Window Parameters}.
|
||
@end defun
|
||
|
||
@defun set-window-configuration configuration &optional dont-set-frame dont-set-miniwindow
|
||
This function restores the configuration of windows and buffers as
|
||
specified by @var{configuration}, for the frame that
|
||
@var{configuration} was created for, regardless of whether that frame
|
||
is selected or not. The argument @var{configuration} must be a value
|
||
that was previously returned by @code{current-window-configuration}
|
||
for that frame. Normally the function also selects the frame which is
|
||
recorded in the configuration, but if @var{dont-set-frame} is
|
||
non-@code{nil}, it leaves selected the frame which was already
|
||
selected at the start of the function.
|
||
|
||
Normally the function restores the saved minibuffer (if any), but if
|
||
@var{dont-set-miniwindow} is non-@code{nil}, the minibuffer current
|
||
at the start of the function (if any) remains in the mini-window.
|
||
|
||
If the frame from which @var{configuration} was saved is dead, all
|
||
this function does is to restore the value of the variable
|
||
@code{minibuffer-scroll-window} and to adjust the value returned by
|
||
@code{minibuffer-selected-window}. In this case, the function returns
|
||
@code{nil}. Otherwise, it returns @code{t}.
|
||
|
||
This function consults the variable
|
||
@code{window-restore-killed-buffer-windows} (see below) when it tries to
|
||
restore a window whose buffer was killed after @var{configuration} was
|
||
recorded.
|
||
|
||
Here is a way of using this function to get the same effect as
|
||
@code{save-window-excursion}:
|
||
|
||
@example
|
||
@group
|
||
(let ((config (current-window-configuration)))
|
||
(unwind-protect
|
||
(progn (split-window-below nil)
|
||
@dots{})
|
||
(set-window-configuration config)))
|
||
@end group
|
||
@end example
|
||
@end defun
|
||
|
||
@defmac save-window-excursion forms@dots{}
|
||
This macro records the window configuration of the selected frame,
|
||
executes @var{forms} in sequence, then restores the earlier window
|
||
configuration. The return value is the value of the final form in
|
||
@var{forms}.
|
||
|
||
Most Lisp code should not use this macro; @code{save-selected-window}
|
||
is typically sufficient. In particular, this macro cannot reliably
|
||
prevent the code in @var{forms} from opening new windows, because new
|
||
windows might be opened in other frames (@pxref{Choosing Window}), and
|
||
@code{save-window-excursion} only saves and restores the window
|
||
configuration on the current frame.
|
||
@end defmac
|
||
|
||
@defun window-configuration-p object
|
||
This function returns @code{t} if @var{object} is a window configuration.
|
||
@end defun
|
||
|
||
@defun window-configuration-equal-p config1 config2
|
||
This function says whether two window configurations have the same
|
||
window layout, but ignores the values of point and the saved scrolling
|
||
positions---it can return @code{t} even if those aspects differ.
|
||
@end defun
|
||
|
||
@defun window-configuration-frame config
|
||
This function returns the frame for which the window configuration
|
||
@var{config} was made.
|
||
@end defun
|
||
|
||
Other primitives to look inside of window configurations would make
|
||
sense, but are not implemented because we did not need them. See the
|
||
file @file{winner.el} for some more operations on windows
|
||
configurations.
|
||
|
||
The objects returned by @code{current-window-configuration} die
|
||
together with the Emacs process. In order to store a window
|
||
configuration on disk and read it back in another Emacs session, you
|
||
can use the functions described next. These functions are also useful
|
||
to clone the state of a frame into an arbitrary live window
|
||
(@code{set-window-configuration} effectively clones the windows of a
|
||
frame into the root window of that very frame only).
|
||
|
||
@cindex window state
|
||
@defun window-state-get &optional window writable
|
||
This function returns the state of @var{window} as a Lisp object. The
|
||
argument @var{window} must be a valid window and defaults to the root
|
||
window of the selected frame.
|
||
|
||
If the optional argument @var{writable} is non-@code{nil}, this means to
|
||
not use markers for sampling positions like @code{window-point} or
|
||
@code{window-start}. This argument should be non-@code{nil} when the
|
||
state will be written to disk and read back in another session.
|
||
|
||
Together, the argument @var{writable} and the variable
|
||
@code{window-persistent-parameters} specify which window parameters are
|
||
saved by this function. @xref{Window Parameters}.
|
||
@end defun
|
||
|
||
The value returned by @code{window-state-get} can be used in the same
|
||
session to make a clone of a window in another window. It can be also
|
||
written to disk and read back in another session. In either case, use
|
||
the following function to restore the state of the window.
|
||
|
||
@defun window-state-put state &optional window ignore
|
||
This function puts the window state @var{state} into @var{window}.
|
||
The argument @var{state} should be the state of a window returned by
|
||
an earlier invocation of @code{window-state-get}, see above. The
|
||
optional argument @var{window} can be either a live window or an
|
||
internal window (@pxref{Windows and Frames}). If @var{window} is not
|
||
a live window, it is replaced by a new live window created on the same
|
||
frame before putting @var{state} into it. If @var{window} is @code{nil},
|
||
it puts the window state into a new window.
|
||
|
||
This function consults the variable
|
||
@code{window-restore-killed-buffer-windows} (see below) when it tries to
|
||
restore a window whose buffer was killed after @var{state} was recorded.
|
||
|
||
If the optional argument @var{ignore} is non-@code{nil}, it means to ignore
|
||
minimum window sizes and fixed-size restrictions. If @var{ignore}
|
||
is @code{safe}, this means windows can get as small as one line
|
||
and/or two columns.
|
||
@end defun
|
||
|
||
By default, @code{set-window-configuration} and @code{window-state-put}
|
||
may delete a window from the restored configuration when they find out
|
||
that its buffer was killed since the corresponding configuration or
|
||
state has been recorded. The variable described next can be used to
|
||
fine-tune that behavior.
|
||
|
||
@cindex restoring windows whose buffers have been killed
|
||
@defvar window-restore-killed-buffer-windows
|
||
This variable specifies how @code{set-window-configuration} and
|
||
@code{window-state-put} shall handle a window whose buffer has been
|
||
killed since the corresponding configuration or state was recorded. Any
|
||
such window may be live---in which case it shows some other buffer---or
|
||
dead at the time one of these functions is called. Usually,
|
||
@code{set-window-configuration} leaves the window alone if it is live
|
||
while @code{window-state-put} deletes it.
|
||
|
||
The following values can be used to override the default behavior for
|
||
dead windows in the case of @code{set-window-configuration} and for dead
|
||
and live windows in the case of @code{window-state-put}.
|
||
|
||
@table @asis
|
||
@item @code{t}
|
||
This value means to unconditionally restore the window and show some
|
||
other buffer in it.
|
||
|
||
@item @code{delete}
|
||
This means to unconditionally try to delete the window.
|
||
|
||
@item @code{dedicated}
|
||
This means to try to delete the window if and only if it is dedicated to
|
||
its buffer.
|
||
|
||
@item @code{nil}
|
||
This is the default, and it means that @code{set-window-configuration}
|
||
will try to delete the window if and only if it is dedicated to its
|
||
buffer, and @code{window-state-put} will unconditionally try to delete
|
||
it.
|
||
|
||
@item a function
|
||
This means to restore the window and show some other buffer in it, like
|
||
if the value is @code{t}, and also add an entry for that window to a
|
||
list that will be later passed as the second argument to that function.
|
||
@end table
|
||
|
||
If a window cannot be deleted (typically, because it is the last window
|
||
on its frame), @code{set-window-configuration} and
|
||
@code{window-state-put} will show another buffer in it.
|
||
|
||
If the value of this variable is a function, that function should take
|
||
three arguments. The first argument specifies the frame whose windows
|
||
have been restored. The third argument is either the symbol
|
||
@code{configuration} if the windows are restored by
|
||
@code{set-window-configuration}, or the symbol @code{state} if the
|
||
windows are restored by @code{window-state-put}.
|
||
|
||
The second argument specifies a list of entries for @emph{all} windows
|
||
whose previous buffers have been found dead at the time
|
||
@code{set-window-configuration} or @code{window-state-put} tried to
|
||
restore them (minibuffer windows are excluded). This means that the
|
||
function may also delete windows which were found live by
|
||
@code{set-window-configuration}.
|
||
|
||
Each entry in the list that is passed as the second argument to the
|
||
function is itself a list of six values: the window whose buffer was
|
||
found dead, the dead buffer or its name, the positions of window-start
|
||
(@pxref{Window Start and End}) and window-point (@pxref{Window Point})
|
||
of the buffer in that window, the dedicated state of the window as
|
||
previously reported by @code{window-dedicated-p} and a flag that is
|
||
@code{t} if the window has been found to be alive by
|
||
@code{set-window-configuration} and @code{nil} otherwise.
|
||
@end defvar
|
||
|
||
The functions @code{window-state-get} and @code{window-state-put} also
|
||
allow exchanging the contents of two live windows. The following
|
||
function does precisely that:
|
||
|
||
@deffn Command window-swap-states &optional window-1 window-2 size
|
||
This command swaps the states of the two live windows @var{window-1} and
|
||
@var{window-2}. @var{window-1} must specify a live window and defaults
|
||
to the selected one. @var{window-2} must specify a live window and
|
||
defaults to the window following @var{window-1} in the cyclic ordering
|
||
of windows, excluding minibuffer windows and including live windows on
|
||
all visible frames.
|
||
|
||
Optional argument @var{size} non-@code{nil} means to try swapping the
|
||
sizes of @var{window-1} and @var{window-2} as well. A value of
|
||
@code{height} means to swap heights only, a value of @code{width}
|
||
means to swap widths only, while @code{t} means to swap both widths
|
||
and heights, if possible. Frames are not resized by this function.
|
||
@end deffn
|
||
|
||
|
||
@node Window Parameters
|
||
@section Window Parameters
|
||
@cindex window parameters
|
||
|
||
This section describes the window parameters that can be used to
|
||
associate additional information with windows.
|
||
|
||
@defun window-parameter window parameter
|
||
This function returns @var{window}'s value for @var{parameter}. The
|
||
default for @var{window} is the selected window. If @var{window} has no
|
||
setting for @var{parameter}, this function returns @code{nil}.
|
||
@end defun
|
||
|
||
@defun window-parameters &optional window
|
||
This function returns all parameters of @var{window} and their values.
|
||
The default for @var{window} is the selected window. The return value
|
||
is either @code{nil}, or an association list whose elements have the form
|
||
@code{(@var{parameter} . @var{value})}.
|
||
@end defun
|
||
|
||
@defun set-window-parameter window parameter value
|
||
This function sets @var{window}'s value of @var{parameter} to
|
||
@var{value} and returns @var{value}. The default for @var{window}
|
||
is the selected window.
|
||
@end defun
|
||
|
||
By default, the functions that save and restore window configurations
|
||
or the states of windows (@pxref{Window Configurations}) do not care
|
||
about window parameters. This means that when you change the value of
|
||
a parameter within the body of a @code{save-window-excursion}, the
|
||
previous value is not restored when that macro exits. It also means
|
||
that when you restore via @code{window-state-put} a window state saved
|
||
earlier by @code{window-state-get}, all cloned windows have their
|
||
parameters reset to @code{nil}. The following variable allows you to
|
||
override the standard behavior:
|
||
|
||
@cindex persistent window parameters
|
||
@defvar window-persistent-parameters
|
||
This variable is an alist specifying which parameters get saved by
|
||
@code{current-window-configuration} and @code{window-state-get}, and
|
||
subsequently restored by @code{set-window-configuration} and
|
||
@code{window-state-put}. @xref{Window Configurations}.
|
||
|
||
The @sc{car} of each entry of this alist is a symbol specifying the
|
||
parameter. The @sc{cdr} should be one of the following:
|
||
|
||
@table @asis
|
||
@item @code{nil}
|
||
This value means the parameter is saved neither by
|
||
@code{window-state-get} nor by @code{current-window-configuration}.
|
||
|
||
@item @code{t}
|
||
This value specifies that the parameter is saved by
|
||
@code{current-window-configuration} and (provided its @var{writable}
|
||
argument is @code{nil}) by @code{window-state-get}.
|
||
|
||
@item @code{writable}
|
||
This means that the parameter is saved unconditionally by both
|
||
@code{current-window-configuration} and @code{window-state-get}. This
|
||
value should not be used for parameters whose values do not have a read
|
||
syntax. Otherwise, invoking @code{window-state-put} in another session
|
||
may fail with an @code{invalid-read-syntax} error.
|
||
@end table
|
||
@end defvar
|
||
|
||
Some functions (notably @code{delete-window},
|
||
@code{delete-other-windows} and @code{split-window}), may behave
|
||
specially when the window specified by their @var{window} argument has
|
||
a parameter whose name is equal to the function's name. You can
|
||
override such special behavior by binding the following variable to a
|
||
non-@code{nil} value:
|
||
|
||
@defvar ignore-window-parameters
|
||
If this variable is non-@code{nil}, some standard functions do not
|
||
process window parameters. The functions currently affected by this are
|
||
@code{split-window}, @code{delete-window}, @code{delete-other-windows},
|
||
and @code{other-window}.
|
||
|
||
An application can bind this variable to a non-@code{nil} value around
|
||
calls to these functions. If it does so, the application is fully
|
||
responsible for correctly assigning the parameters of all involved
|
||
windows when exiting that function.
|
||
@end defvar
|
||
|
||
The following parameters are currently used by the window management
|
||
code:
|
||
|
||
@table @code
|
||
@item delete-window
|
||
@vindex delete-window@r{, a window parameter}
|
||
This parameter affects the execution of @code{delete-window}
|
||
(@pxref{Deleting Windows}).
|
||
|
||
@item delete-other-windows
|
||
@vindex delete-other-windows@r{, a window parameter}
|
||
This parameter affects the execution of @code{delete-other-windows}
|
||
(@pxref{Deleting Windows}).
|
||
|
||
@item no-delete-other-windows
|
||
@vindex no-delete-other-windows@r{, a window parameter}
|
||
This parameter marks the window as not deletable by
|
||
@code{delete-other-windows} (@pxref{Deleting Windows}).
|
||
|
||
@item split-window
|
||
@vindex split-window@r{, a window parameter}
|
||
This parameter affects the execution of @code{split-window}
|
||
(@pxref{Splitting Windows}).
|
||
|
||
@item other-window
|
||
@vindex other-window@r{, a window parameter}
|
||
This parameter affects the execution of @code{other-window}
|
||
(@pxref{Cyclic Window Ordering}).
|
||
|
||
@item no-other-window
|
||
@vindex no-other-window@r{, a window parameter}
|
||
This parameter marks the window as not selectable by @code{other-window}
|
||
(@pxref{Cyclic Window Ordering}). It is by default @code{t} for tooltip
|
||
windows (@pxref{Basic Windows}). Use @code{window-no-other-p}
|
||
(@pxref{Cyclic Window Ordering}) to check whether it applies to a
|
||
specific window.
|
||
|
||
@item clone-of
|
||
@vindex clone-of@r{, a window parameter}
|
||
This parameter specifies the window that this one has been cloned
|
||
from. It is installed by @code{window-state-get} (@pxref{Window
|
||
Configurations}).
|
||
|
||
@item window-preserved-size
|
||
@vindex window-preserved-size@r{, a window parameter}
|
||
This parameter specifies a buffer, a direction where @code{nil} means
|
||
vertical and @code{t} horizontal, and a size in pixels. If this window
|
||
displays the specified buffer and its size in the indicated direction
|
||
equals the size specified by this parameter, then Emacs will try to
|
||
preserve the size of this window in the indicated direction. This
|
||
parameter is installed and updated by the function
|
||
@code{window-preserve-size} (@pxref{Preserving Window Sizes}).
|
||
|
||
@item quit-restore
|
||
@item quit-restore-prev
|
||
@vindex quit-restore@r{, a window parameter}
|
||
@vindex quit-restore-prev@r{, a window parameter}
|
||
These parameters are installed by the buffer display functions
|
||
(@pxref{Choosing Window}) and consulted by @code{quit-restore-window}
|
||
(@pxref{Quitting Windows}). They are lists of four elements, see the
|
||
description of @code{quit-restore-window} in @ref{Quitting Windows} for
|
||
details.
|
||
|
||
@item window-side
|
||
@itemx window-slot
|
||
@vindex window-side@r{, a window parameter}
|
||
@vindex window-slot@r{, a window parameter}
|
||
These parameters are used internally for implementing side windows
|
||
(@pxref{Side Windows}).
|
||
|
||
@item window-atom
|
||
@vindex window-atom@r{, a window parameter}
|
||
This parameter is used internally for implementing atomic windows, see
|
||
@ref{Atomic Windows}.
|
||
|
||
@item mode-line-format
|
||
@vindex mode-line-format@r{, a window parameter}
|
||
This parameter replaces the value of the buffer-local variable
|
||
@code{mode-line-format} (@pxref{Mode Line Basics}) of this window's
|
||
buffer whenever this window is displayed. The symbol @code{none} means
|
||
to suppress display of a mode line for this window. Display and
|
||
contents of the mode line on other windows showing this buffer are not
|
||
affected.
|
||
|
||
@item header-line-format
|
||
@vindex header-line-format@r{, a window parameter}
|
||
This parameter replaces the value of the buffer-local variable
|
||
@code{header-line-format} (@pxref{Mode Line Basics}) of this window's
|
||
buffer whenever this window is displayed. The symbol @code{none} means
|
||
to suppress display of a header line for this window. Display and
|
||
contents of the header line on other windows showing this buffer are not
|
||
affected.
|
||
|
||
@item tab-line-format
|
||
@vindex tab-line-format@r{, a window parameter}
|
||
This parameter replaces the value of the buffer-local variable
|
||
@code{tab-line-format} (@pxref{Mode Line Basics}) of this window's
|
||
buffer whenever this window is displayed. The symbol @code{none} means
|
||
to suppress display of a tab line for this window. Display and
|
||
contents of the tab line on other windows showing this buffer are not
|
||
affected.
|
||
|
||
@item min-margins
|
||
@vindex min-margins@r{, a window parameter}
|
||
The value of this parameter is a cons cell whose @sc{car} and
|
||
@sc{cdr}, if non-@code{nil}, specify the minimum values (in columns)
|
||
for the left and right margin of this window (@pxref{Display Margins}.
|
||
When present, Emacs will use these values instead of the actual margin
|
||
widths for determining whether a window can be split or shrunk
|
||
horizontally.
|
||
|
||
Emacs never auto-adjusts the margins of any window after splitting or
|
||
resizing it. It is the sole responsibility of any application setting
|
||
this parameter to adjust the margins of this window as well as those of
|
||
any new window that inherits this window's margins due to a split.
|
||
Both @code{window-configuration-change-hook} and
|
||
@code{window-size-change-functions} (@pxref{Window Hooks}) should be
|
||
employed for this purpose.
|
||
|
||
This parameter was introduced in Emacs version 25.1 to support
|
||
applications that use large margins to center buffer text within a
|
||
window and should be used, with due care, exclusively by those
|
||
applications. It might be replaced by an improved solution in future
|
||
versions of Emacs.
|
||
@end table
|
||
|
||
|
||
@node Window Hooks
|
||
@section Hooks for Window Scrolling and Changes
|
||
@cindex hooks for window operations
|
||
|
||
This section describes how Lisp programs can take action after a
|
||
window has been scrolled or other window modifications occurred. We
|
||
first consider the case where a window shows a different part of its
|
||
buffer.
|
||
|
||
@defvar window-scroll-functions
|
||
This variable holds a list of functions that Emacs should call before
|
||
redisplaying a window with scrolling. Displaying a different buffer
|
||
in a window and making a new window also call these functions.
|
||
|
||
This variable is not a normal hook, because each function is called
|
||
with two arguments: the window, and its new display-start position.
|
||
At the time of the call, the display-start position of the argument
|
||
window is already set to its new value, and the buffer to be displayed
|
||
in the window is set as the current buffer.
|
||
|
||
These functions must take care when using @code{window-end}
|
||
(@pxref{Window Start and End}); if you need an up-to-date value, you
|
||
must use the @var{update} argument to ensure you get it.
|
||
|
||
@strong{Warning:} don't use this feature to alter the way the window
|
||
is scrolled. It's not designed for that, and such use probably won't
|
||
work.
|
||
@end defvar
|
||
|
||
In addition, you can use @code{jit-lock-register} to register a Font
|
||
Lock fontification function, which will be called whenever parts of a
|
||
buffer are (re)fontified because a window was scrolled or its size
|
||
changed. @xref{Other Font Lock Variables}.
|
||
|
||
@cindex window change functions
|
||
The remainder of this section covers six hooks that are called
|
||
during redisplay provided a significant, non-scrolling change of a
|
||
window has been detected. For simplicity, these hooks and the
|
||
functions they call will be collectively referred to as @dfn{window
|
||
change functions}. As any hook, these hooks can be set either
|
||
globally or buffer-locally via the @var{local} argument of
|
||
@code{add-hook} (@pxref{Setting Hooks}) when the hook is installed.
|
||
|
||
@cindex window buffer change
|
||
The first of these hooks is run after a @dfn{window buffer change} is
|
||
detected, which means that a window was created, deleted or assigned
|
||
another buffer.
|
||
|
||
@defvar window-buffer-change-functions
|
||
This variable specifies functions called during redisplay when window
|
||
buffers have changed. The value should be a list of functions that
|
||
take one argument.
|
||
|
||
Functions specified buffer-locally are called for any window showing
|
||
the corresponding buffer if that window has been created or assigned
|
||
that buffer since the last time window change functions were run. In
|
||
this case the window is passed as argument.
|
||
|
||
Functions specified by the default value are called for a frame if at
|
||
least one window on that frame has been added, deleted or assigned
|
||
another buffer since the last time window change functions were run.
|
||
In this case the frame is passed as argument.
|
||
@end defvar
|
||
|
||
@cindex window size change
|
||
The second of these hooks is run when a @dfn{window size change} has
|
||
been detected which means that a window was created, assigned another
|
||
buffer, or changed its total size or that of its text area.
|
||
|
||
@defvar window-size-change-functions
|
||
This variable specifies functions called during redisplay when a
|
||
window size change occurred. The value should be a list of functions
|
||
that take one argument.
|
||
|
||
Functions specified buffer-locally are called for any window showing
|
||
the corresponding buffer if that window has been added or assigned
|
||
another buffer or changed its total or body size since the last time
|
||
window change functions were run. In this case the window is passed
|
||
as argument.
|
||
|
||
Functions specified by the default value are called for a frame if at
|
||
least one window on that frame has been added or assigned another
|
||
buffer or changed its total or body size since the last time window
|
||
change functions were run. In this case the frame is passed as
|
||
argument.
|
||
@end defvar
|
||
|
||
@cindex window selection change
|
||
The third of these hooks is run when a @dfn{window selection change}
|
||
has selected another window since the last redisplay.
|
||
|
||
@defvar window-selection-change-functions
|
||
This variable specifies functions called during redisplay when the
|
||
selected window or a frame's selected window has changed. The value
|
||
should be a list of functions that take one argument.
|
||
|
||
Functions specified buffer-locally are called for any window showing
|
||
the corresponding buffer if that window has been selected or
|
||
deselected (among all windows or among all windows on its frame) since
|
||
the last time window change functions were run. In this case the
|
||
window is passed as argument.
|
||
|
||
Functions specified by the default value are called for a frame if
|
||
that frame has been selected or deselected or the frame's selected
|
||
window has changed since the last time window change functions were
|
||
run. In this case the frame is passed as argument.
|
||
@end defvar
|
||
|
||
@cindex window state change
|
||
The fourth of these hooks is run when a @dfn{window state change} has
|
||
been detected, which means that at least one of the three preceding
|
||
window changes has occurred.
|
||
|
||
@defvar window-state-change-functions
|
||
This variable specifies functions called during redisplay when a
|
||
window buffer or size change occurred or the selected window or a
|
||
frame's selected window has changed. The value should be a list of
|
||
functions that take one argument.
|
||
|
||
Functions specified buffer-locally are called for any window showing
|
||
the corresponding buffer if that window has been added or assigned
|
||
another buffer, changed its total or body size or has been selected or
|
||
deselected (among all windows or among all windows on its frame) since
|
||
the last time window change functions were run. In this case the
|
||
window is passed as argument.
|
||
|
||
Functions specified by the default value are called for a frame if at
|
||
least one window on that frame has been added, deleted or assigned
|
||
another buffer, changed its total or body size or that frame has been
|
||
selected or deselected or the frame's selected window has changed
|
||
since the last time window change functions were run. In this case
|
||
the frame is passed as argument.
|
||
|
||
Functions specified by the default value are also run for a frame when
|
||
that frame's window state change flag (see below) has been set since
|
||
last redisplay.
|
||
@end defvar
|
||
|
||
@cindex window configuration change
|
||
The fifth of these hooks is run when a @dfn{window configuration
|
||
change} has been detected which means that either the buffer or the
|
||
size of a window changed. It differs from the four preceding hooks in
|
||
the way it is run.
|
||
|
||
@defvar window-configuration-change-hook
|
||
This variable specifies functions called during redisplay when either
|
||
the buffer or the size of a window has changed. The value should be a
|
||
list of functions that take no argument.
|
||
|
||
Functions specified buffer-locally are called for any window showing
|
||
the corresponding buffer if at least one window on that frame has been
|
||
added, deleted or assigned another buffer or changed its total or
|
||
body size since the last time window change functions were run. Each
|
||
call is performed with the window showing the buffer temporarily
|
||
selected and its buffer current.
|
||
|
||
Functions specified by the default value are called for each frame if
|
||
at least one window on that frame has been added, deleted or assigned
|
||
another buffer or changed its total or body size since the last time
|
||
window change functions were run. Each call is performed with the
|
||
frame temporarily selected and the selected window's buffer current.
|
||
@end defvar
|
||
|
||
Finally, Emacs runs a normal hook that generalizes the behavior of
|
||
@code{window-state-change-functions}.
|
||
|
||
@defvar window-state-change-hook
|
||
The default value of this variable specifies functions called during
|
||
redisplay when a window state change has been detected or the window
|
||
state change flag has been set on at least one frame. The value
|
||
should be a list of functions that take no argument.
|
||
|
||
Applications should put a function on this hook only if they want to
|
||
react to changes that happened on (or have been signaled for) two or
|
||
more frames since last redisplay. In every other case, putting the
|
||
function on @code{window-state-change-functions} should be preferred.
|
||
@end defvar
|
||
|
||
Window change functions are called during redisplay for each frame as
|
||
follows: First, any buffer-local window buffer change function, window
|
||
size change function, selected window change and window state change
|
||
functions are called in this order. Next, the default values for
|
||
these functions are called in the same order. Then any buffer-local
|
||
window configuration change functions are called followed by functions
|
||
specified by the default value of those functions. Finally, functions
|
||
on @code{window-state-change-hook} are run.
|
||
|
||
Window change functions are run for a specific frame only if a
|
||
corresponding change was registered for that frame earlier. Such
|
||
changes include the creation or deletion of a window or the assignment
|
||
of another buffer or size to a window. Note that even when such a
|
||
change has been registered, this does not mean that any of the hooks
|
||
described above is run. If, for example, a change was registered
|
||
within the scope of a window excursion (@pxref{Window
|
||
Configurations}), this will trigger a call of window change functions
|
||
only if that excursion still persists at the time change functions are
|
||
run. If it is exited earlier, hooks will be run only if registered by
|
||
a change outside the scope of that excursion.
|
||
|
||
@cindex window state change flag
|
||
The @dfn{window state change flag} of a frame, if set, will cause
|
||
the default values of @code{window-state-change-functions} (for that
|
||
frame) and @code{window-state-change-hook} to be run during next
|
||
redisplay regardless of whether a window state change actually
|
||
occurred for that frame or not. After running any functions on these
|
||
hooks, the flag is reset for each frame. Applications can set that
|
||
flag and inspect its value using the following functions.
|
||
|
||
@defun set-frame-window-state-change &optional frame arg
|
||
This function sets @var{frame}'s window state change flag if @var{arg}
|
||
is non-@code{nil} and resets it otherwise. @var{frame} must be a live
|
||
frame and defaults to the selected one.
|
||
@end defun
|
||
|
||
@defun frame-window-state-change &optional frame
|
||
This functions returns @code{t} if @var{frame}'s window state change
|
||
flag is set and @code{nil} otherwise. @var{frame} must be a live
|
||
frame and defaults to the selected one.
|
||
@end defun
|
||
|
||
While window change functions are run, the functions described next
|
||
can be called to get more insight into what has changed for a specific
|
||
window or frame since the last redisplay. All these functions take a
|
||
live window as single, optional argument, defaulting to the selected
|
||
window.
|
||
|
||
@defun window-old-buffer &optional window
|
||
This function returns the buffer shown in @var{window} at the last
|
||
time window change functions were run for @var{window}'s frame. If it
|
||
returns @code{nil}, @var{window} has been created after that. If it
|
||
returns @code{t}, @var{window} was not shown at that time but has been
|
||
restored from a previously saved window configuration afterwards.
|
||
Otherwise, the return value is the buffer shown by @var{window} at
|
||
that time.
|
||
@end defun
|
||
|
||
@defun window-old-pixel-width &optional window
|
||
This function returns the total pixel width of @var{window} the
|
||
last time window change functions found @var{window} live on its
|
||
frame. It is zero if @var{window} was created after that.
|
||
@end defun
|
||
|
||
@defun window-old-pixel-height &optional window
|
||
This function returns the total pixel height of @var{window} the last
|
||
time window change functions found @var{window} live on its frame.
|
||
It is zero if @var{window} was created after that.
|
||
@end defun
|
||
|
||
@defun window-old-body-pixel-width &optional window
|
||
This function returns the pixel width of @var{window}'s text area the
|
||
last time window change functions found @var{window} live on its
|
||
frame. It is zero if @var{window} was created after that.
|
||
@end defun
|
||
|
||
@defun window-old-body-pixel-height &optional window
|
||
This function returns the pixel height of @var{window}'s text area the
|
||
last time window change functions found @var{window} live on its
|
||
frame. It is zero if @var{window} was created after that.
|
||
@end defun
|
||
|
||
In order to find out which window or frame was selected the last time
|
||
window change functions were run, the following functions can be used:
|
||
|
||
@defun frame-old-selected-window &optional frame
|
||
This function returns the selected window of @var{frame} at the last
|
||
time window change functions were run. If omitted or @code{nil}
|
||
@var{frame} defaults to the selected frame.
|
||
@end defun
|
||
|
||
@defun old-selected-window
|
||
This function returns the selected window at the last time window
|
||
change functions were run.
|
||
@end defun
|
||
|
||
@defun old-selected-frame
|
||
This function returns the selected frame at the last time window
|
||
change functions were run.
|
||
@end defun
|
||
|
||
Note that window change functions provide no information about which
|
||
windows have been deleted since the last time they were run. If
|
||
necessary, applications should remember any window showing a specific
|
||
buffer in a local variable of that buffer and update it in a function
|
||
run by the default values of any of the hooks that are run when a
|
||
window buffer change was detected.
|
||
|
||
The following caveats should be considered when adding a function
|
||
to window change functions:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
Some operations will not trigger a call of window change functions.
|
||
These include showing another buffer in a minibuffer window or any
|
||
change of a tooltip window.
|
||
|
||
@item
|
||
Window change functions should not create or delete windows or change
|
||
the buffer, size or selection status of any window because there is no
|
||
guarantee that the information about such a change will be propagated
|
||
to other window change functions. If at all, any such change should
|
||
be executed only by the last function listed by the default value of
|
||
@code{window-state-change-hook}.
|
||
|
||
@item
|
||
Macros like @code{save-window-excursion}, @code{with-selected-window}
|
||
or @code{with-current-buffer} can be used when running window change
|
||
functions.
|
||
|
||
@item
|
||
Running window change functions does not save and restore match data.
|
||
Unless running @code{window-configuration-change-hook} it does not
|
||
save or restore the selected window or frame or the current buffer
|
||
either.
|
||
|
||
@item
|
||
Any redisplay triggering the run of window change functions may be
|
||
aborted. If the abort occurs before window change functions have run
|
||
to their completion, they will be run again with the previous values,
|
||
that is, as if redisplay had not been performed. If aborted later,
|
||
they will be run with the new values, that is, as if redisplay had
|
||
been actually performed.
|
||
@end itemize
|