]> code.delx.au - gnu-emacs/blobdiff - lispref/windows.texi
(Output Streams): Clarify behavior of point for marker output streams.
[gnu-emacs] / lispref / windows.texi
index 6e983113f51cd110f0e252b7d0652a0bd75637c6..158ab354057368647ed9ea6d9cea90f8f6ac0942 100644 (file)
@@ -1,6 +1,7 @@
 @c -*-texinfo-*-
 @c This is part of the GNU Emacs Lisp Reference Manual.
-@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998 Free Software Foundation, Inc.
+@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999
+@c   Free Software Foundation, Inc.
 @c See the file elisp.texi for copying conditions.
 @setfilename ../info/windows
 @node Windows, Frames, Buffers, Top
@@ -23,8 +24,9 @@ displayed in windows.
 * Window Point::            Each window has its own location of point.
 * Window Start::            The display-start position controls which text
                               is on-screen in the window.
-* Vertical Scrolling::      Moving text up and down in the window.
-* Horizontal Scrolling::    Moving text sideways on the 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.
 * Size of Window::          Accessing the size of a window.
 * Resizing Windows::        Changing the size of a window.
 * Coordinates and Windows:: Converting coordinates to windows.
@@ -95,6 +97,15 @@ the mark
 
 @item
 how recently the window was selected
+
+@item
+fringe settings
+
+@item
+display margins
+
+@item
+scroll-bar settings
 @end itemize
 
 @cindex multiple windows
@@ -147,8 +158,9 @@ This function splits @var{window} into two windows.  The original
 window @var{window} remains the selected window, but occupies only
 part of its former screen area.  The rest is occupied by a newly created
 window which is returned as the value of this function.
+This function returns the newly created window.
 
-  If @var{horizontal} is non-@code{nil}, then @var{window} splits into
+If @var{horizontal} is non-@code{nil}, then @var{window} splits into
 two side by side windows.  The original window @var{window} keeps the
 leftmost @var{size} columns, and gives the rest of the columns to the
 new window.  Otherwise, it splits into windows one above the other, and
@@ -157,14 +169,18 @@ lines to the new window.  The original window is therefore the
 left-hand or upper of the two, and the new window is the right-hand or
 lower.
 
-  If @var{window} is omitted or @code{nil}, then the selected window is
+If @var{window} is omitted or @code{nil}, then the selected window is
 split.  If @var{size} is omitted or @code{nil}, then @var{window} is
 divided evenly into two parts.  (If there is an odd line, it is
 allocated to the new window.)  When @code{split-window} is called
 interactively, all its arguments are @code{nil}.
 
-  The following example starts with one window on a screen that is 50
-lines high by 80 columns wide; then the window is split.
+If splitting would result in making a window that is smaller than
+@code{window-min-height} or @code{window-min-width}, the function
+signals an error and does not split the window at all.
+
+The following example starts with one window on a screen that is 50
+lines high by 80 columns wide; then it splits the window.
 
 @smallexample
 @group
@@ -206,7 +222,7 @@ The screen looks like this:
 @end group
 @end smallexample
 
-Next, the top window is split horizontally:
+Next, split the top window horizontally:
 
 @smallexample
 @group
@@ -228,7 +244,7 @@ Next, the top window is split horizontally:
 @end smallexample
 
 @need 3000
-Now, the screen looks like this:
+Now the screen looks like this:
 
 @smallexample
 @group
@@ -246,42 +262,37 @@ Now, the screen looks like this:
 @end smallexample
 
 Normally, Emacs indicates the border between two side-by-side windows
-with a scroll bar (@pxref{X Frame Parameters,Scroll Bars}) or @samp{|}
+with a scroll bar (@pxref{Window Frame Parameters,Scroll Bars}) or @samp{|}
 characters.  The display table can specify alternative border
 characters; see @ref{Display Tables}.
 @end deffn
 
-@deffn Command split-window-vertically size
-This function splits the selected window into two windows, one above
-the other, leaving the selected window with @var{size} lines.
-
-This function is simply an interface to @code{split-windows}.
-Here is the complete function definition for it:
-
-@smallexample
-@group
-(defun split-window-vertically (&optional arg)
-  "Split current window into two windows, @dots{}"
-  (interactive "P")
-  (split-window nil (and arg (prefix-numeric-value arg))))
-@end group
-@end smallexample
+@deffn Command split-window-vertically &optional size
+This function splits the selected window into two windows, one above the
+other, leaving the upper of the two windows selected, with @var{size}
+lines.  (If @var{size} is negative, then the lower of the two windows
+gets @minus{} @var{size} lines and the upper window gets the rest, but
+the upper window is still the one selected.)
 @end deffn
 
-@deffn Command split-window-horizontally size
+@deffn Command split-window-horizontally &optional size
 This function splits the selected window into two windows
 side-by-side, leaving the selected window with @var{size} columns.
 
-This function is simply an interface to @code{split-windows}.  Here is
-the complete definition for @code{split-window-horizontally} (except for
-part of the documentation string):
+This function is basically an interface to @code{split-window}.
+You could define a simplified version of the function like this:
 
 @smallexample
 @group
 (defun split-window-horizontally (&optional arg)
   "Split selected window into two windows, side by side..."
   (interactive "P")
-  (split-window nil (and arg (prefix-numeric-value arg)) t))
+@end group
+@group
+  (let ((size (and arg (prefix-numeric-value arg))))
+    (and size (< size 0)
+        (setq size (+ (window-width) size)))
+    (split-window nil size t)))
 @end group
 @end smallexample
 @end deffn
@@ -290,8 +301,7 @@ part of the documentation string):
 This function returns non-@code{nil} if there is only one window.  The
 argument @var{no-mini}, if non-@code{nil}, means don't count the
 minibuffer even if it is active; otherwise, the minibuffer window is
-included, if active, in the total number of windows, which is compared
-against one.
+counted when it is active.
 
 The argument @var{all-frames} specifies which frames to consider.  Here
 are the possible values and their meanings:
@@ -328,8 +338,7 @@ of a window aside from restoring a saved window configuration
 deletes any windows that aren't part of that configuration.
 
   When you delete a window, the space it took up is given to one
-adjacent sibling.  (In Emacs version 18, the space was divided evenly
-among all the siblings.)
+adjacent sibling.
 
 @c Emacs 19 feature
 @defun window-live-p window
@@ -341,14 +350,10 @@ using a deleted window as if it were live.
 @end defun
 
 @deffn Command delete-window &optional window
-This function removes @var{window} from the display.  If @var{window}
-is omitted, then the selected window is deleted.  An error is signaled
-if there is only one window when @code{delete-window} is called.
-
-This function returns @code{nil}.
-
-When @code{delete-window} is called interactively, @var{window}
-defaults to the selected window.
+This function removes @var{window} from display, and returns @code{nil}.
+If @var{window} is omitted, then the selected window is deleted.  An
+error is signaled if there is only one window when @code{delete-window}
+is called.
 @end deffn
 
 @deffn Command delete-other-windows &optional window
@@ -356,7 +361,7 @@ This function makes @var{window} the only window on its frame, by
 deleting the other windows in that frame.  If @var{window} is omitted or
 @code{nil}, then the selected window is used by default.
 
-The result is @code{nil}.
+The return value is @code{nil}.
 @end deffn
 
 @deffn Command delete-windows-on buffer &optional frame
@@ -371,16 +376,20 @@ where there is only one window), then the frame reverts to having a
 single window showing another buffer chosen with @code{other-buffer}.
 @xref{The Buffer List}.
 
-The argument @var{frame} controls which frames to operate on:
+The argument @var{frame} controls which frames to operate on.  This
+function does not use it in quite the same way as the other functions
+which scan all windows; specifically, the values @code{t} and @code{nil}
+have the opposite of their meanings in other functions.  Here are the
+full details:
 
 @itemize @bullet
 @item
-If it is @code{nil}, operate on the selected frame.
+If it is @code{nil}, operate on all frames.
 @item
-If it is @code{t}, operate on all frames.
+If it is @code{t}, operate on the selected frame.
 @item
 If it is @code{visible}, operate on all visible frames.
-@item 0
+@item
 If it is 0, operate on all visible or iconified frames.
 @item
 If it is a frame, operate on that frame.
@@ -401,11 +410,15 @@ This function returns the selected window.  This is the window in
 which the cursor appears and to which many commands apply.
 @end defun
 
-@defun select-window window
+@defun select-window window &optional norecord
 This function makes @var{window} the selected window.  The cursor then
 appears in @var{window} (on redisplay).  The buffer being displayed in
 @var{window} is immediately designated the current buffer.
 
+Normally @var{window}'s selected buffer is moved to the front of the
+buffer list, but if @var{norecord} is non-@code{nil}, the buffer list
+order is unchanged.
+
 The return value is @var{window}.
 
 @example
@@ -418,17 +431,22 @@ The return value is @var{window}.
 @end defun
 
 @defmac save-selected-window forms@dots{}
-This macro records the selected window, executes @var{forms}
-in sequence, then restores the earlier selected window.
-
-This macro does not save or restore anything about the sizes, arrangement
-or contents of windows; therefore, if the @var{forms} change them,
-the change persists.
+This macro records the selected window of each frame, executes
+@var{forms} in sequence, then restores the earlier selected windows.
+
+This macro does not save or restore anything about the sizes,
+arrangement or contents of windows; therefore, if the @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 this form,
+that frame's selected window is left alone.
+@end defmac
 
-Each frame, at any time, has a window selected within the frame.  This
-macro only saves @emph{the} selected window; it does not save anything
-about other frames.  If the @var{forms} select some other frame and
-alter the window selected within it, the change persists.
+@defmac with-selected-window window forms@dots{}
+This macro selects @var{window} (without changing the buffer list),
+executes @var{forms} in sequence, then restores the previously
+selected window (unless that window is no longer alive).  It is similar
+to @code{save-selected-window} except that it explicitly selects
+@var{window} and that it does not alter the buffer list sequence.
 @end defmac
 
 @cindex finding windows
@@ -468,8 +486,23 @@ If there are two windows of the same size, then the function returns
 the window that is first in the cyclic ordering of windows (see
 following section), starting from the selected window.
 
-The argument @var{frame} controls which set of windows are
-considered.  See @code{get-lru-window}, above.
+The argument @var{frame} controls which set of windows to
+consider.  See @code{get-lru-window}, above.
+@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 returns a window satisfying @var{predicate}.  It cycles
+through all visible windows using @code{walk-windows} (@pxref{Cyclic
+Window Ordering}), calling @var{predicate} on each one of them
+with that window as its argument.  The function returns the first
+window for which @var{predicate} returns a non-@code{nil} value; if
+that never happens, it returns @var{default}.
+
+The optional arguments @var{minibuf} and @var{all-frames} specify the
+set of windows to include in the scan.  See the description of
+@code{next-window} in @ref{Cyclic Window Ordering}, for details.
 @end defun
 
 @node Cyclic Window Ordering
@@ -534,6 +567,9 @@ must ensure @var{window} is in a visible frame.)
 @item 0
 Consider all windows in all visible or iconified frames.
 
+@item a frame
+Consider all windows on that frame.
+
 @item anything else
 Consider precisely the windows in @var{window}'s frame, and no others.
 @end table
@@ -563,10 +599,14 @@ ordering of windows.  The other arguments specify which windows to
 include in the cycle, as in @code{next-window}.
 @end defun
 
-@deffn Command other-window count
+@deffn Command other-window count &optional all-frames
 This function selects the @var{count}th following window in the cyclic
-order.  If count is negative, then it selects the @minus{}@var{count}th
-preceding window.  It returns @code{nil}.
+order.  If count is negative, then it moves back @minus{}@var{count}
+windows in the cycle, rather than forward.  It returns @code{nil}.
+
+The argument @var{all-frames} has the same meaning as in
+@code{next-window}, but the @var{minibuf} argument of @code{next-window}
+is always effectively @code{nil}.
 
 In an interactive call, @var{count} is the numeric prefix argument.
 @end deffn
@@ -581,6 +621,21 @@ set of windows to include in the scan.  See @code{next-window}, above,
 for details.
 @end defun
 
+@defun window-list &optional frame minibuf window
+This function returns a list of the windows on @var{frame}, starting
+with @var{window}.  If @var{frame} is @code{nil} or omitted, the
+selected frame is used instead; if @var{window} is @code{nil} or
+omitted, the selected window is used instead.
+
+The value of @var{minibuf} determines if the minibuffer window will be
+included in the result list.  If @var{minibuf} is @code{t}, the
+minibuffer window will be included, even if it isn't active.  If
+@var{minibuf} is @code{nil} or omitted, the minibuffer window will
+only be included in the list if it is active.  If @var{minibuf} is
+neither @code{nil} nor @code{t}, the minibuffer window is not
+included, whether or not it is active.
+@end defun
+
 @node Buffers and Windows
 @section Buffers and Windows
 @cindex examining windows
@@ -592,17 +647,19 @@ display buffers in windows in a precisely controlled fashion.
 @iftex
 See the following section for
 @end iftex
-@ifinfo
+@ifnottex
 @xref{Displaying Buffers}, for
-@end ifinfo
+@end ifnottex
 related functions that find a window to use and specify a buffer for it.
 The functions described there are easier to use than these, but they
 employ heuristics in choosing or creating a window; use these functions
 when you need complete control.
 
-@defun set-window-buffer window buffer-or-name
+@defun set-window-buffer window buffer-or-name &optional keep-margins
 This function makes @var{window} display @var{buffer-or-name} as its
-contents.  It returns @code{nil}.
+contents.  It returns @code{nil}.  This is the fundamental primitive
+for changing which buffer is displayed in a window, and all ways
+of doing that call this function.
 
 @example
 @group
@@ -610,6 +667,12 @@ contents.  It returns @code{nil}.
      @result{} nil
 @end group
 @end example
+
+Normally, displaying @var{buffer} in @var{window} resets the window's
+display margins, fringe widths, scroll bar settings, and position
+based on the local variables of @var{buffer}.  However, if
+@var{keep-margins} is non-@code{nil}, the display margins and fringe
+widths of @var{window} remain unchanged.  @xref{Fringes}.
 @end defun
 
 @defun window-buffer &optional window
@@ -674,6 +737,15 @@ If it is a frame, consider windows on that frame.
 @end itemize
 @end defun
 
+@defvar buffer-display-time
+This variable records the time at which a buffer was last made visible
+in a window.  It is always local in each buffer; each time
+@code{set-window-buffer} is called, it sets this variable to
+@code{(current-time)} in the specified buffer (@pxref{Time of Day}).
+When a buffer is first created, @code{buffer-display-time} starts out
+with the value @code{nil}.
+@end defvar
+
 @node Displaying Buffers
 @section Displaying Buffers in Windows
 @cindex switching to a buffer
@@ -687,18 +759,19 @@ window.
 @iftex
 See the preceding section for
 @end iftex
-@ifinfo
+@ifnottex
 @xref{Buffers and Windows}, for
-@end ifinfo
-low-level functions that give you more precise control.
+@end ifnottex
+low-level functions that give you more precise control.  All of these
+functions work by calling @code{set-window-buffer}.
 
   Do not use the functions in this section in order to make a buffer
 current so that a Lisp program can access or modify it; they are too
 drastic for that purpose, since they change the display of buffers in
-windows, which is gratuitous and will surprise the user.  Instead, use
-@code{set-buffer} (@pxref{Current Buffer}) and @code{save-excursion}
-(@pxref{Excursions}), which designate buffers as current for programmed
-access without affecting the display of buffers in windows.
+windows, which would be gratuitous and surprise the user.  Instead, use
+@code{set-buffer} and @code{save-current-buffer} (@pxref{Current
+Buffer}), which designate buffers as current for programmed access
+without affecting the display of buffers in windows.
 
 @deffn Command switch-to-buffer buffer-or-name &optional norecord
 This function makes @var{buffer-or-name} the current buffer, and also
@@ -713,14 +786,15 @@ buffer by that name is created.  The major mode for the new buffer is
 set according to the variable @code{default-major-mode}.  @xref{Auto
 Major Mode}.
 
-Normally the specified buffer is put at the front of the buffer list.
-This affects the operation of @code{other-buffer}.  However, if
+Normally the specified buffer is put at the front of the buffer list
+(both the selected frame's buffer list and the frame-independent buffer
+list).  This affects the operation of @code{other-buffer}.  However, if
 @var{norecord} is non-@code{nil}, this is not done.  @xref{The Buffer
 List}.
 
 The @code{switch-to-buffer} function is often used interactively, as
 the binding of @kbd{C-x b}.  It is also used frequently in programs.  It
-always returns @code{nil}.
+returns the buffer that it switched to.
 @end deffn
 
 @deffn Command switch-to-buffer-other-window buffer-or-name &optional norecord
@@ -743,7 +817,9 @@ unless @var{norecord} is non-@code{nil}.
 This function makes @var{buffer-or-name} the current buffer and
 switches to it in some window, preferably not the window previously
 selected.  The ``popped-to'' window becomes the selected window within
-its frame.
+its frame.  The return value is the buffer that was switched to.
+If @var{buffer-or-name} is @code{nil}, that means to choose some
+other buffer, but you don't specify which.
 
 If the variable @code{pop-up-frames} is non-@code{nil},
 @code{pop-to-buffer} looks for a window in any visible frame already
@@ -790,14 +866,6 @@ don't care which other buffer is used; you just want to make sure that
 This function returns @code{nil}.
 @end deffn
 
-@tindex buffer-display-count
-@defvar buffer-display-count
-This variable is always local in each buffer.  When the buffer is
-created, @code{buffer-display-count} has value 0.  Each time the buffer
-is displayed in a window, that increments the value of
-@code{buffer-display-count}.
-@end defvar
-
 @node Choosing Window
 @section Choosing a Window for Display
 
@@ -823,16 +891,38 @@ function does nothing.
 @var{buffer-or-name}.
 
 If the argument @var{frame} is non-@code{nil}, it specifies which frames
-to check when deciding whether the buffer is already displayed.  Its
-value means the same thing as in functions @code{get-buffer-window}
-(@pxref{Buffers and Windows}).  If the buffer is already displayed
-in some window on one of these frames, @code{display-buffer} simply
-returns that window.
+to check when deciding whether the buffer is already displayed.  If the
+buffer is already displayed in some window on one of these frames,
+@code{display-buffer} simply returns that window.  Here are the possible
+values of @var{frame}:
+
+@itemize @bullet
+@item
+If it is @code{nil}, consider windows on the selected frame.
+@item
+If it is @code{t}, consider windows on all frames.
+@item
+If it is @code{visible}, consider windows on all visible frames.
+@item
+If it is 0, consider windows on all visible or iconified frames.
+@item
+If it is a frame, consider windows on that frame.
+@end itemize
 
 Precisely how @code{display-buffer} finds or creates a window depends on
 the variables described below.
 @end deffn
 
+@defopt display-buffer-reuse-frames
+If this variable is non-@code{nil}, @code{display-buffer} searches
+existing frames for a window displaying the buffer.  If the buffer is
+already displayed in a window in some frame, @code{display-buffer} makes
+the frame visible and raises it, to use that window.  If the buffer is
+not already displayed, or if @code{display-buffer-reuse-frames} is
+@code{nil}, @code{display-buffer}'s behavior is determined by other
+variables, described below.
+@end defopt
+
 @defopt pop-up-windows
 This variable controls whether @code{display-buffer} makes new windows.
 If it is non-@code{nil} and there is only one window, then that window
@@ -848,6 +938,15 @@ window is not this tall, it is split only if it is the sole window and
 @code{pop-up-windows} is non-@code{nil}.
 @end defopt
 
+@defopt even-window-heights
+This variable determines if @code{display-buffer} should even out window
+heights if the buffer gets displayed in an existing window, above or
+beneath another existing window.  If @code{even-window-heights} is
+@code{t}, the default, window heights will be evened out.  If
+@code{even-window-heights} is @code{nil}, the original window heights
+will be left alone.
+@end defopt
+
 @c Emacs 19 feature
 @defopt pop-up-frames
 This variable controls whether @code{display-buffer} makes new frames.
@@ -864,7 +963,7 @@ splits a window or reuses one.
 @end defopt
 
 @c Emacs 19 feature
-@defvar pop-up-frame-function
+@defopt pop-up-frame-function
 This variable specifies how to make a new frame if @code{pop-up-frames}
 is non-@code{nil}.
 
@@ -873,15 +972,15 @@ Its value should be a function of no arguments.  When
 function, which should return a frame.  The default value of the
 variable is a function that creates a frame using parameters from
 @code{pop-up-frame-alist}.
-@end defvar
+@end defopt
 
-@defvar pop-up-frame-alist
+@defopt pop-up-frame-alist
 This variable holds an alist specifying frame parameters used when
 @code{display-buffer} makes a new frame.  @xref{Frame Parameters}, for
 more information about frame parameters.
-@end defvar
+@end defopt
 
-@defvar special-display-buffer-names
+@defopt special-display-buffer-names
 A list of buffer names for buffers that should be displayed specially.
 If the buffer's name is in this list, @code{display-buffer} handles the
 buffer specially.
@@ -889,14 +988,33 @@ buffer specially.
 By default, special display means to give the buffer a dedicated frame.
 
 If an element is a list, instead of a string, then the @sc{car} of the
-list is the buffer name, and the rest of the list says how to create the
-frame.  There are two possibilities for the rest of the list.  It can be
-an alist, specifying frame parameters, or it can contain a function and
-arguments to give to it.  (The function's first argument is always the
-buffer to be displayed; the arguments from the list come after that.)
-@end defvar
+list is the buffer name, and the rest of the list says how to create
+the frame.  There are two possibilities for the rest of the list (its
+@sc{cdr}).  It can be an alist, specifying frame parameters, or it can
+contain a function and arguments to give to it.  (The function's first
+argument is always the buffer to be displayed; the arguments from the
+list come after that.)
 
-@defvar special-display-regexps
+For example:
+
+@example
+(("myfile" (minibuffer) (menu-bar-lines . 0)))
+@end example
+
+@noindent
+specifies to display a buffer named @samp{myfile} in a dedicated frame
+with specified @code{minibuffer} and @code{menu-bar-lines} parameters.
+
+The list of frame parameters can also use the phony frame parameters
+@code{same-frame} and @code{same-window}.  If the specified frame
+parameters include @code{(same-window . @var{value})} and @var{value}
+is non-@code{nil}, that means to display the buffer in the current
+selected window.  Otherwise, if they include @code{(same-frame .
+@var{value})} and @var{value} is non-@code{nil}, that means to display
+the buffer in a new window in the currently selected frame.
+@end defopt
+
+@defopt special-display-regexps
 A list of regular expressions that specify buffers that should be
 displayed specially.  If the buffer's name matches any of the regular
 expressions in this list, @code{display-buffer} handles the buffer
@@ -907,7 +1025,7 @@ By default, special display means to give the buffer a dedicated frame.
 If an element is a list, instead of a string, then the @sc{car} of the
 list is the regular expression, and the rest of the list says how to
 create the frame.  See above, under @code{special-display-buffer-names}.
-@end defvar
+@end defopt
 
 @defvar special-display-function
 This variable holds the function to call to display a buffer specially.
@@ -918,16 +1036,24 @@ The default value of this variable is
 @code{special-display-popup-frame}.
 @end defvar
 
-@defun special-display-popup-frame buffer
+@defun special-display-popup-frame buffer &rest args
 This function makes @var{buffer} visible in a frame of its own.  If
 @var{buffer} is already displayed in a window in some frame, it makes
 the frame visible and raises it, to use that window.  Otherwise, it
 creates a frame that will be dedicated to @var{buffer}.
 
-This function uses an existing window displaying @var{buffer} whether or
-not it is in a frame of its own; but if you set up the above variables
-in your init file, before @var{buffer} was created, then presumably the
-window was previously made by this function.
+If @var{args} is an alist, it specifies frame parameters for the new
+frame.
+
+If @var{args} is a list whose @sc{car} is a symbol, then @code{(car
+@var{args})} is called as a function to actually create and set up the
+frame; it is called with @var{buffer} as first argument, and @code{(cdr
+@var{args})} as additional arguments.
+
+This function always uses an existing window displaying @var{buffer},
+whether or not it is in a frame of its own; but if you set up the above
+variables in your init file, before @var{buffer} was created, then
+presumably the window was previously made by this function.
 @end defun
 
 @defopt special-display-frame-alist
@@ -965,11 +1091,12 @@ described above.
 @c Emacs 19 feature
 @cindex dedicated window
 A window can be marked as ``dedicated'' to its buffer.  Then
-@code{display-buffer} does not try to use that window.
+@code{display-buffer} will not try to use that window to display any
+other buffer.
 
 @defun window-dedicated-p window
-This function returns @code{t} if @var{window} is marked as dedicated;
-otherwise @code{nil}.
+This function returns non-@code{nil} if @var{window} is marked as
+dedicated; otherwise @code{nil}.
 @end defun
 
 @defun set-window-dedicated-p window flag
@@ -1014,10 +1141,11 @@ point and the buffer's point always move together; they remain equal.
 when the user switches to another buffer, the cursor jumps to the
 position of point in that buffer.
 
-@defun window-point window
+@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.
+window's buffer) if that window were selected.  If @var{window} is
+@code{nil}, the selected window is used.
 
 When @var{window} is the selected window and its buffer is also the
 current buffer, the value returned is the same as point in that buffer.
@@ -1060,41 +1188,40 @@ display-start position is set to a display-start position recently used
 for the same buffer, or 1 if the buffer doesn't have any.
 
 Redisplay updates the window-start position (if you have not specified
-it explicitly since the previous redisplay) so that 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.
+it explicitly since the previous redisplay)---for example, 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.
 
 For a realistic example of using @code{window-start}, see the
 description of @code{count-lines} in @ref{Text Lines}.
 @end defun
 
-@defun window-end &optional window
+@defun window-end &optional window update
 This function returns the position of the end of the display in window
 @var{window}.  If @var{window} is @code{nil}, the selected window is
 used.
 
 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 actually finishes.
+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 a value that is not correct.  In a
-future version, @code{window-end} will return @code{nil} in that case.
-@ignore
-in that case, this function returns @code{nil}.  You can compute where
-the end of the window @emph{would} have been, if redisplay had finished,
-like this:
-
-@example
-(save-excursion
-  (goto-char (window-start window))
-  (vertical-motion (1- (window-height window))
-                   window)
-  (point))
-@end example
-@end ignore
+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 the window ends, based on the current
+@code{window-start} value.  If the saved value is valid,
+@code{window-end} returns that; 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.
 @end defun
 
 @defun set-window-start window position &optional noforce
@@ -1158,12 +1285,16 @@ 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
 
-@defun pos-visible-in-window-p &optional position window
-This function returns @code{t} 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.  The
-argument @var{position} defaults to the current position of point;
-@var{window}, to the selected window.  Here is an example:
+@defun pos-visible-in-window-p &optional position window partially
+This function returns @code{t} 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 or horizontally 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}, to the selected window.
+
+Here is an example:
 
 @example
 @group
@@ -1172,22 +1303,21 @@ argument @var{position} defaults to the current position of point;
     (recenter 0))
 @end group
 @end example
-
-The @code{pos-visible-in-window-p} 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
-@code{t}.  @xref{Horizontal Scrolling}.
 @end defun
 
-@node Vertical Scrolling
-@section Vertical Scrolling
-@cindex vertical scrolling
-@cindex scrolling vertically
+@node Textual Scrolling
+@section Textual Scrolling
+@cindex textual scrolling
+@cindex scrolling textually
 
-  Vertical scrolling means moving the text up or down in a window.  It
-works by changing the value of the window's display-start location.  It
-may also change the value of @code{window-point} to keep it on the
-screen.
+  @dfn{Textual scrolling} means moving the text up or down though a
+window.  It works by changing the value of the window's display-start
+location.  It may also change the value of @code{window-point} to keep
+point on the screen.
+
+  Textual scrolling was formerly called ``vertical scrolling,'' but we
+changed its name to distinguish it from the new vertical fractional
+scrolling feature (@pxref{Vertical Scrolling}).
 
   In the commands @code{scroll-up} and @code{scroll-down}, the directions
 ``up'' and ``down'' refer to the motion of the text in the buffer at which
@@ -1206,9 +1336,10 @@ position of a window on the terminal does not move, and short scrolling
 commands clearly move the text up or down on the screen.  We have chosen
 names that fit the user's point of view.
 
-  The scrolling functions (aside from @code{scroll-other-window}) have
-unpredictable results if the current buffer is different from the buffer
-that is displayed in the selected window.  @xref{Current Buffer}.
+  The textual scrolling functions (aside from
+@code{scroll-other-window}) have unpredictable results if the current
+buffer is different from the buffer that is displayed in the selected
+window.  @xref{Current Buffer}.
 
 @deffn Command scroll-up &optional count
 This function scrolls the text in the selected window upward
@@ -1219,7 +1350,8 @@ If @var{count} is @code{nil} (or omitted), then the length of scroll
 is @code{next-screen-context-lines} lines less than the usable height of
 the window (not counting its mode line).
 
-@code{scroll-up} returns @code{nil}.
+@code{scroll-up} returns @code{nil}, unless it gets an error
+because it can't scroll any further.
 @end deffn
 
 @deffn Command scroll-down &optional count
@@ -1231,7 +1363,8 @@ If @var{count} is omitted or @code{nil}, then the length of the scroll
 is @code{next-screen-context-lines} lines less than the usable height of
 the window (not counting its mode line).
 
-@code{scroll-down} returns @code{nil}.
+@code{scroll-down} returns @code{nil}, unless it gets an error because
+it can't scroll any further.
 @end deffn
 
 @deffn Command scroll-other-window &optional count
@@ -1239,10 +1372,14 @@ 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 a buffer to scroll with the variable
-@code{other-window-scroll-buffer}.  When the selected window is the
-minibuffer, the next window is normally the one at the top left corner.
-You can specify a different window to scroll with the variable
+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 one at the top left corner.  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.  @xref{Minibuffer Misc}.
 
@@ -1260,13 +1397,61 @@ If this variable is non-@code{nil}, it tells @code{scroll-other-window}
 which buffer to scroll.
 @end defvar
 
-@defopt scroll-step
+@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 scroll-conservatively
 This variable controls how scrolling is done automatically when point
-moves off the screen.  If the value is zero, then redisplay scrolls the
-text to center point vertically in the window.  If the value is a
-positive integer @var{n}, then redisplay brings point back on screen by
-scrolling @var{n} lines in either direction, if possible; otherwise, it
-centers point.  The default value is zero.
+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 action 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
+@tindex 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
+@tindex 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-up-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 it 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
+
+@defopt scroll-preserve-screen-position
+If this option is non-@code{nil}, the scroll functions move point so
+that the vertical position of the cursor is unchanged, when that is
+possible.
 @end defopt
 
 @defopt next-screen-context-lines
@@ -1279,15 +1464,16 @@ bottom of the window appear instead at the top.  The default value is
 
 @deffn Command recenter &optional count
 @cindex centering point
-This function scrolls the selected window to put the text where point
-is located at a specified vertical position within the window.
+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 nonnegative number, it 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 a non-@code{nil} list, then it stands for the line in
-the middle of the window.
+If @var{count} is a nonnegative 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 a non-@code{nil} list, then it
+stands for the line in the middle of the window.
 
 If @var{count} is @code{nil}, @code{recenter} puts the line containing
 point in the middle of the window, then clears and redisplays the entire
@@ -1316,42 +1502,127 @@ Replaces three keystroke sequence C-u 0 C-l."
 @end example
 @end deffn
 
+@node Vertical Scrolling
+@section Vertical Fractional Scrolling
+@cindex Vertical Fractional Scrolling
+
+  @dfn{Vertical fractional scrolling} means shifting the image in the
+window up or down by a specified multiple or fraction of a line.
+Starting in Emacs 21, 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.  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 are 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
+This function returns the current vertical scroll position of
+@var{window}, If @var{window} is @code{nil}, the selected window is
+used.
+
+@example
+@group
+(window-vscroll)
+     @result{} 0
+@end group
+@end example
+@end defun
+
+@defun set-window-vscroll window lines
+This function sets @var{window}'s vertical scroll position to
+@var{lines}.  The argument @var{lines} should be zero or positive; if
+not, it is taken as zero.
+
+If @var{window} is @code{nil}, the selected window is used.
+
+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
+@end defun
+
 @node Horizontal Scrolling
 @section Horizontal Scrolling
 @cindex horizontal scrolling
 
-  Because we read English first from top to bottom and second from left
-to right, horizontal scrolling is not like vertical scrolling.  Vertical
-scrolling involves selection of a contiguous portion of text to display.
-Horizontal scrolling causes part of each line to go off screen.  The
-amount of horizontal scrolling is therefore specified as a number of
-columns rather than as a position in the buffer.  It has nothing to do
-with the display-start position returned by @code{window-start}.
+  @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
-screen 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.
-
-@deffn Command scroll-left count
+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.
+
+@deffn Command scroll-left &optional count
 This function scrolls the selected window @var{count} columns to the
-left (or to the right if @var{count} is negative).  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).
+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).
 @end deffn
 
-@deffn Command scroll-right count
+@deffn Command scroll-right &optional count
 This function scrolls the selected window @var{count} columns to the
-right (or to the left if @var{count} is negative).  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).
+right (or to the left 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).
 
 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
@@ -1385,9 +1656,19 @@ If @var{window} is @code{nil}, the selected window is used.
 @end defun
 
 @defun set-window-hscroll window columns
-This function sets the number of columns from the left margin that
-@var{window} is scrolled from the value of @var{columns}.  The argument
-@var{columns} should be zero or positive; if not, it is taken as zero.
+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.  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}.
 
@@ -1429,9 +1710,9 @@ characters that separates side-by-side windows.
 
 @defun window-height &optional window
 This function returns the number of lines in @var{window}, including
-its mode line.  If @var{window} fills its entire frame, this is one less
-than the value of @code{frame-height} on that frame (since the last line
-is always reserved for the minibuffer).
+its mode line and header line, if any.  If @var{window} fills its
+entire frame except for the echo area, this is typically one less than
+the value of @code{frame-height} on that frame.
 
 If @var{window} is @code{nil}, the function uses the selected window.
 
@@ -1451,6 +1732,12 @@ If @var{window} is @code{nil}, the function uses the selected window.
 @end example
 @end defun
 
+@tindex window-body-height
+@defun window-body-height &optional window
+Like @code{window-height} but the value does not include the
+mode line (if any) or the header line (if any).
+@end defun
+
 @defun window-width &optional window
 This function returns the number of columns in @var{window}.  If
 @var{window} fills its entire frame, this is the same as the value of
@@ -1478,36 +1765,48 @@ the frame.  The element @var{right} of the value is one more than the
 rightmost column used by @var{window}, and @var{bottom} is one more than
 the bottommost row used by @var{window} and its mode-line.
 
-When you have side-by-side windows, the right edge value for a window
-with a neighbor on the right includes the width of the separator between
-the window and that neighbor.  This separator may be a column of
-@samp{|} characters or it may be a scroll bar.  Since the width of the
-window does not include this separator, the width does not equal the
-difference between the right and left edges in this case.
+If a window has a scroll bar, the right edge value includes the width of
+the scroll bar.  Otherwise, if the window has a neighbor on the right,
+its right edge value includes the width of the separator line between
+the window and that neighbor.  Since the width of the window does not
+include this separator, the width does not usually equal the difference
+between the right and left edges.
+@end defun
+
+@defun window-inside-edges window
+This is similar to @code{window-edges}, but the edge values
+it returns include only the text area of the window.  They
+do not include the header line, mode line, scroll bar or
+vertical separator, fringes, or display margins.
+@end defun
 
-Here is the result obtained on a typical 24-line terminal with just one
-window:
+Here are the results obtained on a typical 24-line terminal with just
+one window, with menu bar enabled:
 
 @example
 @group
 (window-edges (selected-window))
-     @result{} (0 0 80 23)
+     @result{} (0 1 80 23)
+@end group
+@group
+(window-inside-edges (selected-window))
+     @result{} (0 1 80 22)
 @end group
 @end example
 
 @noindent
 The bottom edge is at line 23 because the last line is the echo area.
-
-If @var{window} is at the upper left corner of its frame, then
-@var{bottom} is the same as the value of @code{(window-height)},
-@var{right} is almost the same as the value of
-@code{(window-width)}@footnote{They are not exactly equal because
-@var{right} includes the vertical separator line or scroll bar, while
-@code{(window-width)} does not.}, and @var{top} and @var{left} are zero.
-For example, the edges of the following window are @w{@samp{0 0 5 8}}.
-Assuming that the frame has more than 8 columns, the last column of the
-window (column 7) holds a border rather than text.  The last row (row 4)
-holds the mode line, shown here with @samp{xxxxxxxxx}.
+The bottom inside edge is at line 22, which is the window's mode line.
+
+If @var{window} is at the upper left corner of its frame, and there is
+no menu bar, then @var{bottom} returned by @code{window-edges} is the
+same as the value of @code{(window-height)}, @var{right} is almost the
+same as the value of @code{(window-width)}, and @var{top} and
+@var{left} are zero.  For example, the edges of the following window
+are @w{@samp{0 0 8 5}}.  Assuming that the frame has more than 8
+columns, the last column of the window (column 7) holds a border
+rather than text.  The last row (row 4) holds the mode line, shown
+here with @samp{xxxxxxxxx}.
 
 @example
 @group
@@ -1523,15 +1822,11 @@ holds the mode line, shown here with @samp{xxxxxxxxx}.
 @end group
 @end example
 
-When there are side-by-side windows, any window not at the right edge of
-its frame has a separator in its last column or columns.  The separator
-counts as one or two columns in the width of the window.  A window never
-includes a separator on its left, since that belongs to the window to
-the left.
-
 In the following example, let's suppose that the frame is 7
 columns wide.  Then the edges of the left window are @w{@samp{0 0 4 3}}
 and the edges of the right window are @w{@samp{4 0 7 3}}.
+The inside edges of the left window are @w{@samp{0 0 3 2}},
+and the inside edges of the right window are @w{@samp{4 0 7 2}},
 
 @example
 @group
@@ -1543,6 +1838,17 @@ and the edges of the right window are @w{@samp{4 0 7 3}}.
            0  34  7
 @end group
 @end example
+
+@defun window-pixel-edges window
+This function is like @code{window-edges} except that, on a graphical
+display, the edge values are measured in pixels instead of in
+character lines and columns.
+@end defun
+
+@defun window-inside-pixel-edges window
+This function is like @code{window-inside-edges} except that, on a
+graphical display, the edge values are measured in pixels instead of
+in character lines and columns.
 @end defun
 
 @node Resizing Windows
@@ -1572,6 +1878,13 @@ If the requested size would exceed that of the window's frame, then the
 function makes the window occupy the entire height (or width) of the
 frame.
 
+If there are various other windows from which lines or columns can be
+stolen, and some of them specify fixed size (using
+@code{window-size-fixed}, see below), they are left untouched while
+other windows are ``robbed.''  If it would be necessary to alter the
+size of a fixed-size window, @code{enlarge-window} gets an error
+instead.
+
 If @var{size} is negative, this function shrinks the window by
 @minus{}@var{size} lines or columns.  If that makes the window smaller
 than the minimum size (@code{window-min-height} and
@@ -1614,26 +1927,69 @@ It could be defined as follows:
 @end example
 @end deffn
 
+@deffn Command shrink-window-if-larger-than-buffer &optional window
+This command shrinks @var{window} to be as small as possible while still
+showing the full contents of its buffer---but not less than
+@code{window-min-height} lines.  If @var{window} is not given,
+it defaults to the selected window.
+
+However, the command does nothing if the window is already too small to
+display the whole text of the buffer, or if part of the contents are
+currently scrolled off screen, or if the window is not the full width of
+its frame, or if the window is the only window in its frame.
+@end deffn
+
+@tindex window-size-fixed
+@defvar window-size-fixed
+If this variable is non-@code{nil}, in any given buffer,
+then the size of any window displaying the buffer remains fixed
+unless you explicitly change it or Emacs has no other choice.
+(This feature is new in Emacs 21.)
+
+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.
+
+The usual way to use this variable is to give it a buffer-local value in
+a particular buffer.  That way, the windows (but usually there is only
+one) displaying that buffer have fixed size.
+
+Explicit size-change functions such as @code{enlarge-window}
+get an error if they would have to change a window size which is fixed.
+Therefore, when you want to change the size of such a window,
+you should bind @code{window-size-fixed} to @code{nil}, like this:
+
+@example
+(let ((window-size-fixed nil))
+   (enlarge-window 10))
+@end example
+
+Note that changing the frame size will change the size of a
+fixed-size window, if there is no other alternative.
+@end defvar
+
 @cindex minimum window size
-  The following two variables constrain the window-size-changing
+  The following two variables constrain the window-structure-changing
 functions to a minimum height and width.
 
 @defopt window-min-height
 The value of this variable determines how short a window may become
 before it is automatically deleted.  Making a window smaller than
-@code{window-min-height} automatically deletes it, and no window may be
-created shorter than this.  The absolute minimum height is two (allowing
-one line for the mode line, and one line for the buffer display).
-Actions that change window sizes reset this variable to two if it is
-less than two.  The default value is 4.
+@code{window-min-height} automatically deletes it, and no window may
+be created shorter than this.  The default value is 4.
+
+The absolute minimum window height is one; actions that change window
+sizes reset this variable to one if it is less than one.
 @end defopt
 
 @defopt window-min-width
 The value of this variable determines how narrow a window may become
-before it automatically deleted.  Making a window smaller than
+before it is automatically deleted.  Making a window smaller than
 @code{window-min-width} automatically deletes it, and no window may be
-created narrower than this.  The absolute minimum width is one; any
-value below that is ignored.  The default value is 10.
+created narrower than this.  The default value is 10.
+
+The absolute minimum window width is two; actions that change window
+sizes reset this variable to two if it is less than two.
 @end defopt
 
 @node Coordinates and Windows
@@ -1654,16 +2010,9 @@ If you omit @var{frame}, the selected frame is used.
 This function checks whether a particular frame position falls within
 the window @var{window}.
 
-@need 3000
-The argument @var{coordinates} is a cons cell of this form:
-
-@example
-(@var{x} . @var{y})
-@end example
-
-@noindent
-The coordinates @var{x} and @var{y} are measured in characters, and
-count from the top left corner of the screen or frame.
+The argument @var{coordinates} is a cons cell of the form @code{(@var{x}
+. @var{y})}.  The coordinates @var{x} and @var{y} are measured in
+characters, and count from the top left corner of the screen or frame.
 
 The value returned by @code{coordinates-in-window-p} is non-@code{nil}
 if the coordinates are inside @var{window}.  The value also indicates
@@ -1679,11 +2028,22 @@ window.
 @item mode-line
 The coordinates are in the mode line of @var{window}.
 
-@item vertical-split
+@item header-line
+The coordinates are in the header line of @var{window}.
+
+@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.
+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}.
@@ -1699,36 +2059,42 @@ argument because it always uses the frame that @var{window} is on.
 @cindex saving window information
 
   A @dfn{window configuration} records the entire layout of one
-frame---all windows, their sizes, which buffers they contain, what part
-of each buffer is displayed, and the values of point and the mark.  You
-can bring back an entire previous layout by restoring a window
-configuration previously saved.
-
-  If you want to record all frames instead of just one, use a frame
-configuration instead of a window configuration.  @xref{Frame
-Configurations}.
-
-@defun current-window-configuration
-This function returns a new object representing the selected frame's
-current window configuration, including the number of windows, their
-sizes and current buffers, which window is the selected window, and for
-each window the displayed buffer, the display-start position, and the
-positions of point and the mark.  An exception is made for point in the
-current buffer, whose value is not saved.
+frame---all windows, their sizes, which buffers they contain, what
+part of each buffer is displayed, and the values of point and the
+mark; also their fringes, margins, and scroll bar settings.  It also
+includes the values of @code{window-min-height},
+@code{window-min-width} and @code{minibuffer-scroll-window}.  An
+exception is made for point in the selected window for the current
+buffer; its value is not saved in the window configuration.
+
+  You can bring back an entire previous layout by restoring a window
+configuration previously saved.  If you want to record 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.  If @var{frame} is omitted, the selected frame
+is used.
 @end defun
 
 @defun set-window-configuration configuration
 This function restores the configuration of windows and buffers as
-specified by @var{configuration}.  The argument @var{configuration} must
-be a value that was previously returned by
-@code{current-window-configuration}.  This function operates on the
-frame for which @var{configuration} was made, whether that frame is
-selected or not.
-
-This function always counts as a window size change and triggers
-execution of the @code{window-size-change-functions}.  (It doesn't know
-how to tell whether the new configuration actually differs from the old
-one.)
+specified by @var{configuration}, for the frame that @var{configuration}
+was created for.
+
+The argument @var{configuration} must be a value that was previously
+returned by @code{current-window-configuration}.  This configuration is
+restored in the frame from which @var{configuration} was made, whether
+that frame is selected or not.  This always counts as a window size
+change and triggers execution of the @code{window-size-change-functions}
+(@pxref{Window Hooks}), because @code{set-window-configuration} doesn't
+know how to tell whether the new configuration actually differs from the
+old one.
+
+If the frame which @var{configuration} was saved from is dead, all this
+function does is restore the three variables @code{window-min-height},
+@code{window-min-width} and @code{minibuffer-scroll-window}.
 
 Here is a way of using this function to get the same effect
 as @code{save-window-excursion}:
@@ -1752,7 +2118,7 @@ that is visible.  It also includes the choice of selected window.
 However, it does not include the value of point in the current buffer;
 use @code{save-excursion} also, if you wish to preserve that.
 
-Don't use this construct when @code{save-selected-window} is all you need.
+Don't use this construct when @code{save-selected-window} is sufficient.
 
 Exit from @code{save-window-excursion} always triggers execution of the
 @code{window-size-change-functions}.  (It doesn't know how to tell
@@ -1784,11 +2150,23 @@ For example:
 
 @defun window-configuration-p object
 This function returns @code{t} if @var{object} is a window configuration.
+@end defun
+
+@defun compare-window-configurations config1 config2
+This function compares two window configurations as regards the
+structure of windows, but ignores the values of point and mark and the
+saved scrolling positions---it can return @code{t} even if those
+aspects differ.
+
+The function @code{equal} can also compare two window configurations; it
+regards configurations as unequal if they differ in any respect, even a
+saved point or mark.
 @end defun
 
   Primitives to look inside of window configurations would make sense,
-but none are implemented.  It is not clear they are useful enough to be
-worth implementing.
+but none are implemented.  It is not clear they are useful enough to
+be worth implementing.  See the file @file{winner.el} for some more
+operations on windows configurations.
 
 @node Window Hooks
 @section Hooks for Window Scrolling and Changes
@@ -1799,8 +2177,7 @@ There are three actions that can change this: scrolling the window,
 switching buffers in the window, and changing the size of the window.
 The first two actions run @code{window-scroll-functions}; the last runs
 @code{window-size-change-functions}.  The paradigmatic use of these
-hooks is Lazy Lock mode; see @ref{Support Modes, Lazy Lock, Font Lock
-Support Modes, emacs, The GNU Emacs Manual}.
+hooks is in the implementation of Lazy Lock mode; see @file{lazy-lock.el}.
 
 @defvar window-scroll-functions
 This variable holds a list of functions that Emacs should call before
@@ -1810,12 +2187,9 @@ display-start position.
 
 Displaying a different buffer in the window also runs these functions.
 
-These functions cannot expect @code{window-end} (@pxref{Window Start})
-to return a meaningful value, because that value is updated only by
-redisplaying the buffer.  So if one of these functions needs to know the
-last character that will fit in the window with its current
-display-start position, it has to find that character using
-@code{vertical-motion} (@pxref{Screen Lines}).
+These functions must be careful in using @code{window-end}
+(@pxref{Window Start}); if you need an up-to-date value, you must use
+the @var{update} argument to ensure you get it.
 @end defvar
 
 @defvar window-size-change-functions
@@ -1841,9 +2215,8 @@ over.  In most cases, @code{save-selected-window} (@pxref{Selecting
 Windows}) is what you need here.
 @end defvar
 
-@tindex redisplay-end-trigger-functions
 @defvar redisplay-end-trigger-functions
-This abnormal hook is run whenever redisplay in window uses text that
+This abnormal hook is run whenever redisplay in window uses text that
 extends past a specified end trigger position.  You set the end trigger
 position with the function @code{set-window-redisplay-end-trigger}.  The
 functions are called with two arguments: the window, and the end trigger
@@ -1852,18 +2225,15 @@ feature, and the trigger value is automatically reset to @code{nil} just
 after the hook is run.
 @end defvar
 
-@tindex set-window-redisplay-end-trigger
 @defun set-window-redisplay-end-trigger window position
 This function sets @var{window}'s end trigger position at
 @var{position}.
 @end defun
 
-@tindex window-redisplay-end-trigger
-@defun window-redisplay-end-trigger window
+@defun window-redisplay-end-trigger &optional window
 This function returns @var{window}'s current end trigger position.
 @end defun
 
-@tindex window-configuration-change-hook
 @defvar window-configuration-change-hook
 A normal hook that is run every time you change the window configuration
 of an existing frame.  This includes splitting or deleting windows,
@@ -1871,3 +2241,7 @@ changing the sizes of windows, or displaying a different buffer in a
 window.  The frame whose window configuration has changed is the
 selected frame when this hook runs.
 @end defvar
+
+@ignore
+   arch-tag: 3f6c36e8-df49-4986-b757-417feed88be3
+@end ignore