Bump version to 23.3.90.
[emacs.git] / doc / lispref / windows.texi
blob51fc5063ded98182c903937d5bf843dcb3b4ea24
1 @c -*-texinfo-*-
2 @c This is part of the GNU Emacs Lisp Reference Manual.
3 @c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001,
4 @c   2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
5 @c   Free Software Foundation, Inc.
6 @c See the file elisp.texi for copying conditions.
7 @setfilename ../../info/windows
8 @node Windows, Frames, Buffers, Top
9 @chapter Windows
11   This chapter describes most of the functions and variables related to
12 Emacs windows.  @xref{Frames and Windows}, for how windows relate to
13 frames.  @xref{Display}, for information on how text is displayed in
14 windows.
16 @menu
17 * Basic Windows::           Basic information on using windows.
18 * Splitting Windows::       Splitting one window into two windows.
19 * Deleting Windows::        Deleting a window gives its space to other windows.
20 * Selecting Windows::       The selected window is the one that you edit in.
21 * Cyclic Window Ordering::  Moving around the existing windows.
22 * Buffers and Windows::     Each window displays the contents of a buffer.
23 * Displaying Buffers::      Higher-level functions for displaying a buffer
24                               and choosing a window for it.
25 * Choosing Window::         How to choose a window for displaying a buffer.
26 * Dedicated Windows::       How to avoid displaying another buffer in
27                               a specific window.
28 * Window Point::            Each window has its own location of point.
29 * Window Start and End::    Buffer positions indicating which text is
30                               on-screen in a window.
31 * Textual Scrolling::       Moving text up and down through the window.
32 * Vertical Scrolling::      Moving the contents up and down on the window.
33 * Horizontal Scrolling::    Moving the contents sideways on the window.
34 * Size of Window::          Accessing the size of a window.
35 * Resizing Windows::        Changing the size of a window.
36 * Coordinates and Windows:: Converting coordinates to windows.
37 * Window Tree::             The layout and sizes of all windows in a frame.
38 * Window Configurations::   Saving and restoring the state of the screen.
39 * Window Parameters::       Associating additional information with windows.
40 * Window Hooks::            Hooks for scrolling, window size changes,
41                               redisplay going past a certain point,
42                               or window configuration changes.
43 @end menu
45 @node Basic Windows
46 @section Basic Concepts of Emacs Windows
47 @cindex window
48 @cindex selected window
50   A @dfn{window} in Emacs is the physical area of the screen in which a
51 buffer is displayed.  The term is also used to refer to a Lisp object that
52 represents that screen area in Emacs Lisp.  It should be
53 clear from the context which is meant.
55   Emacs groups windows into frames; see @ref{Frames}.  A frame
56 represents an area of screen available for Emacs to use.  Each frame
57 always contains at least one window, but you can subdivide it
58 vertically or horizontally into multiple, nonoverlapping Emacs
59 windows.
61   In each frame, at any time, one and only one window is designated as
62 @dfn{selected within the frame}.  The frame's cursor appears in that
63 window, but the other windows have ``non-selected'' cursors, normally
64 less visible.  (@xref{Cursor Parameters}, for customizing this.)  At
65 any time, one frame is the selected frame; and the window selected
66 within that frame is @dfn{the selected window}.  The selected window's
67 buffer is usually the current buffer (except when @code{set-buffer} has
68 been used); see @ref{Current Buffer}.
70   For practical purposes, a window exists only while it is displayed in
71 a frame.  Once removed from the frame, the window is effectively deleted
72 and should not be used, @emph{even though there may still be references
73 to it} from other Lisp objects; see @ref{Deleting Windows}.  Restoring a
74 saved window configuration is the only way for a window no longer on the
75 screen to come back to life; see @ref{Window Configurations}.
77 @cindex multiple windows
78   Users create multiple windows so they can look at several buffers at
79 once.  Lisp libraries use multiple windows for a variety of reasons, but
80 most often to display related information.  In Rmail, for example, you
81 can move through a summary buffer in one window while the other window
82 shows messages one at a time as they are reached.
84   The meaning of ``window'' in Emacs is similar to what it means in the
85 context of general-purpose window systems such as X, but not identical.
86 The X Window System places X windows on the screen; Emacs uses one or
87 more X windows as frames, and subdivides them into
88 Emacs windows.  When you use Emacs on a character-only terminal, Emacs
89 treats the whole terminal screen as one frame.
91 @cindex terminal screen
92 @cindex screen of terminal
93 @cindex tiled windows
94   Most window systems support arbitrarily located overlapping windows.
95 In contrast, Emacs windows are @dfn{tiled}; they never overlap, and
96 together they fill the whole screen or frame.  Because of the way in
97 which Emacs creates new windows (@pxref{Splitting Windows}) and resizes
98 them (@pxref{Resizing Windows}), not all conceivable tilings of windows
99 on an Emacs frame are actually possible.
101 @defun windowp object
102 This function returns @code{t} if @var{object} is a window.
103 @end defun
105 @node Splitting Windows
106 @section Splitting Windows
107 @cindex splitting windows
108 @cindex window splitting
110 The functions described below are the primitives used to split a window
111 into two windows.  They do not accept a buffer as an argument.  Rather,
112 the two ``halves'' of the split window initially display the same buffer
113 previously visible in the window that was split.
115 @deffn Command split-window &optional window size horizontal
116 This function splits a new window out of @var{window}'s screen area.  It
117 returns the new window.  The default for @var{window} is the selected
118 window.  When you split the selected window, it remains selected.
120 If @var{horizontal} is non-@code{nil}, then @var{window} splits into two
121 side by side windows.  The original window keeps the leftmost @var{size}
122 columns, and gives the rest of the columns to the new window.
123 Otherwise, @var{window} splits into windows one above the other, the
124 original window keeps the upper @var{size} lines and gives the rest of
125 the lines to the new window.  The original window @var{window} is
126 therefore the left-hand or upper of the two, and the new window is the
127 right-hand or lower.
129 If @var{size} is omitted or @code{nil}, then @var{window} is divided
130 evenly into two parts.  (If there is an odd line, it is allocated to
131 the new window.)  When @code{split-window} is called interactively,
132 all its arguments are @code{nil}.
134 If splitting would result in making a window that is smaller than
135 @code{window-min-height} or @code{window-min-width} (@pxref{Resizing
136 Windows}), @code{split-window} signals an error and does not split the
137 window at all.
139 The following example starts with one window on a screen that is 50
140 lines high by 80 columns wide; then it splits the window.
142 @smallexample
143 @group
144 (setq w (selected-window))
145      @result{} #<window 8 on windows.texi>
146 (window-edges)          ; @r{Edges in order:}
147      @result{} (0 0 80 50)     ;   @r{left--top--right--bottom}
148 @end group
150 @group
151 ;; @r{Returns window created}
152 (setq w2 (split-window w 15))
153      @result{} #<window 28 on windows.texi>
154 @end group
155 @group
156 (window-edges w2)
157      @result{} (0 15 80 50)    ; @r{Bottom window;}
158                         ;   @r{top is line 15}
159 @end group
160 @group
161 (window-edges w)
162      @result{} (0 0 80 15)     ; @r{Top window}
163 @end group
164 @end smallexample
166 The screen looks like this:
168 @smallexample
169 @group
170          __________
171         |          |  line 0
172         |    w     |
173         |__________|
174         |          |  line 15
175         |    w2    |
176         |__________|
177                       line 50
178  column 0   column 80
179 @end group
180 @end smallexample
182 Next, split the top window horizontally:
184 @smallexample
185 @group
186 (setq w3 (split-window w 35 t))
187      @result{} #<window 32 on windows.texi>
188 @end group
189 @group
190 (window-edges w3)
191      @result{} (35 0 80 15)  ; @r{Left edge at column 35}
192 @end group
193 @group
194 (window-edges w)
195      @result{} (0 0 35 15)   ; @r{Right edge at column 35}
196 @end group
197 @group
198 (window-edges w2)
199      @result{} (0 15 80 50)  ; @r{Bottom window unchanged}
200 @end group
201 @end smallexample
203 @need 3000
204 Now the screen looks like this:
206 @smallexample
207 @group
208      column 35
209          __________
210         |   |      |  line 0
211         | w |  w3  |
212         |___|______|
213         |          |  line 15
214         |    w2    |
215         |__________|
216                       line 50
217  column 0   column 80
218 @end group
219 @end smallexample
221 Normally, Emacs indicates the border between two side-by-side windows
222 with a scroll bar (@pxref{Scroll Bars}), or with @samp{|} characters.  The
223 display table can specify alternative border characters; see @ref{Display
224 Tables}.
225 @end deffn
227 @deffn Command split-window-vertically &optional size
228 This function splits the selected window into two windows, one above the
229 other, leaving the upper of the two windows selected, with @var{size}
230 lines.  (If @var{size} is negative, then the lower of the two windows
231 gets @minus{}@var{size} lines and the upper window gets the rest, but
232 the upper window is still the one selected.)  However, if
233 @code{split-window-keep-point} (see below) is @code{nil}, then either
234 window can be selected.
236 In other respects, this function is similar to @code{split-window}.
237 In particular, the upper window is the original one and the return
238 value is the new, lower window.
239 @end deffn
241 @defopt split-window-keep-point
242 If this variable is non-@code{nil} (the default), then
243 @code{split-window-vertically} behaves as described above.
245 If it is @code{nil}, then @code{split-window-vertically} adjusts point
246 in each of the two windows to avoid scrolling.  (This is useful on
247 slow terminals.)  It selects whichever window contains the screen line
248 that point was previously on.
250 This variable affects the behavior of @code{split-window-vertically}
251 only.  It has no effect on the other functions described here.
252 @end defopt
254 @deffn Command split-window-horizontally &optional size
255 This function splits the selected window into two windows
256 side-by-side, leaving the selected window on the left with @var{size}
257 columns.  If @var{size} is negative, the rightmost window gets
258 @minus{}@var{size} columns, but the leftmost window still remains
259 selected.
261 This function is basically an interface to @code{split-window}.
262 You could define a simplified version of the function like this:
264 @smallexample
265 @group
266 (defun split-window-horizontally (&optional arg)
267   "Split selected window into two windows, side by side..."
268   (interactive "P")
269 @end group
270 @group
271   (let ((size (and arg (prefix-numeric-value arg))))
272     (and size (< size 0)
273          (setq size (+ (window-width) size)))
274     (split-window nil size t)))
275 @end group
276 @end smallexample
277 @end deffn
279 @defun one-window-p &optional no-mini all-frames
280 This function returns non-@code{nil} if there is only one window.  The
281 argument @var{no-mini}, if non-@code{nil}, means don't count the
282 minibuffer even if it is active; otherwise, the minibuffer window is
283 counted when it is active.
285 The argument @var{all-frames} specifies which frames to consider.  Here
286 are the possible values and their meanings:
288 @table @asis
289 @item @code{nil}
290 Count the windows in the selected frame, plus the minibuffer used
291 by that frame even if it lies in some other frame.
293 @item @code{t}
294 Count all windows in all existing frames.
296 @item @code{visible}
297 Count all windows in all visible frames.
299 @item 0
300 Count all windows in all visible or iconified frames.
302 @item anything else
303 Count precisely the windows in the selected frame, and no others.
304 @end table
305 @end defun
307 @node Deleting Windows
308 @section Deleting Windows
309 @cindex deleting windows
311 A window remains visible on its frame unless you @dfn{delete} it by
312 calling certain functions that delete windows.  A deleted window cannot
313 appear on the screen, but continues to exist as a Lisp object until
314 there are no references to it.  There is no way to cancel the deletion
315 of a window aside from restoring a saved window configuration
316 (@pxref{Window Configurations}).  Restoring a window configuration also
317 deletes any windows that aren't part of that configuration.
319   When you delete a window, the space it took up is given to one of
320 its sibling windows adjacent to it.
322 @c Emacs 19 feature
323 @defun window-live-p window
324 This function returns @code{nil} if @var{window} is deleted, and
325 @code{t} otherwise.
327 @strong{Warning:} Erroneous information or fatal errors may result from
328 using a deleted window as if it were live.
329 @end defun
331 @deffn Command delete-window &optional window
332 This function removes @var{window} from display and returns @code{nil}.
333 The default for @var{window} is the selected window.  An error is
334 signaled if @var{window} is the only window on its frame.
335 @end deffn
337 @deffn Command delete-other-windows &optional window
338 This function makes @var{window} the only window on its frame, by
339 deleting the other windows in that frame.  The default for @var{window}
340 is the selected window.  The return value is @code{nil}.
341 @end deffn
343 @deffn Command delete-windows-on &optional buffer-or-name frame
344 This function deletes all windows showing @var{buffer-or-name}.  If
345 there are no windows showing @var{buffer-or-name}, it does nothing.  The
346 optional argument @var{buffer-or-name} may be a buffer or the name of an
347 existing buffer and defaults to the current buffer.
349 @code{delete-windows-on} operates frame by frame.  If a frame has
350 several windows showing different buffers, then those showing
351 @var{buffer-or-name} are removed, and the others expand to fill the
352 space.  If all windows in some frame are showing @var{buffer-or-name}
353 (including the case where there is only one window), then the frame
354 winds up with a single window showing another buffer chosen with
355 @code{other-buffer} (@pxref{The Buffer List}).  If, however, the window
356 showing @var{buffer-or-name} is dedicated to its buffer
357 (@pxref{Dedicated Windows}), and there are other frames left, that
358 window's frame is deleted.
360 The optional argument @var{frame} specifies which frames to operate on.
361 This function does not use it in quite the same way as the other
362 functions which scan all windows; specifically, the values @code{t} and
363 @code{nil} have the opposite of their meanings in other functions.  Here
364 are the full details:
366 @itemize @bullet
367 @item
368 If it is @code{nil}, operate on all frames.
369 @item
370 If it is @code{t}, operate on the selected frame.
371 @item
372 If it is @code{visible}, operate on all visible frames.
373 @item
374 If it is 0, operate on all visible or iconified frames.
375 @item
376 If it is a frame, operate on that frame.
377 @end itemize
379 This function always returns @code{nil}.
380 @end deffn
382 @node Selecting Windows
383 @section Selecting Windows
384 @cindex selecting a window
386   When a window is selected, the buffer in the window becomes the current
387 buffer, and the cursor will appear in it.
389 @defun selected-window
390 This function returns the selected window.  This is the window in
391 which the cursor appears and to which many commands apply.
392 @end defun
394 @defun select-window window &optional norecord
395 This function makes @var{window} the selected window.  The cursor then
396 appears in @var{window} (after redisplay).  Unless @var{window} was
397 already selected, @code{select-window} makes @var{window}'s buffer the
398 current buffer.  The return value is @var{window}.
400 Normally, @var{window}'s selected buffer is moved to the front of the
401 buffer list (@pxref{The Buffer List}) and @var{window} becomes the most
402 recently selected window.  But if @var{norecord} is non-@code{nil}, the
403 buffer list remains unchanged and @var{window} does not become the most
404 recently selected one.
407 @example
408 @group
409 (setq w (next-window))
410 (select-window w)
411      @result{} #<window 65 on windows.texi>
412 @end group
413 @end example
414 @end defun
416 @defmac save-selected-window forms@dots{}
417 This macro records the selected frame, as well as the selected window
418 of each frame, executes @var{forms} in sequence, then restores the
419 earlier selected frame and windows.  It also saves and restores the
420 current buffer.  It returns the value of the last form in @var{forms}.
422 This macro does not save or restore anything about the sizes,
423 arrangement or contents of windows; therefore, if @var{forms} change
424 them, the change persists.  If the previously selected window of some
425 frame is no longer live at the time of exit from @var{forms}, that
426 frame's selected window is left alone.  If the previously selected
427 window is no longer live, then whatever window is selected at the end of
428 @var{forms} remains selected.  The current buffer is restored if and
429 only if it is still live when exiting @var{forms}.
431 This macro changes neither the ordering of recently selected windows nor
432 the buffer list.
433 @end defmac
435 @defmac with-selected-window window forms@dots{}
436 This macro selects @var{window}, executes @var{forms} in sequence, then
437 restores the previously selected window and current buffer.  The ordering
438 of recently selected windows and the buffer list remain unchanged unless
439 you deliberately change them within @var{forms}, for example, by calling
440 @code{select-window} with argument @var{norecord} @code{nil}.
441 @end defmac
443 @cindex finding windows
444   The following functions choose one of the windows on the screen,
445 offering various criteria for the choice.
447 @defun get-lru-window &optional frame dedicated
448 This function returns the window least recently ``used'' (that is,
449 selected) among a set of candidate windows.  If any full-width windows
450 are present, it only considers these.
452 The selected window is returned if it is the only candidate.  A
453 minibuffer window is never a candidate.  A dedicated window
454 (@pxref{Dedicated Windows}) is never a candidate unless the optional
455 argument @var{dedicated} is non-@code{nil}.
457 The optional argument @var{frame} specifies which windows are
458 considered.
460 @itemize @bullet
461 @item
462 If it is @code{nil}, consider windows on the selected frame.
463 @item
464 If it is @code{t}, consider windows on all frames.
465 @item
466 If it is @code{visible}, consider windows on all visible frames.
467 @item
468 If it is 0, consider windows on all visible or iconified frames.
469 @item
470 If it is a frame, consider windows on that frame.
471 @end itemize
472 @end defun
474 @defun get-largest-window &optional frame dedicated
475 This function returns the window with the largest area (height times
476 width).  If there are no side-by-side windows, then this is the window
477 with the most lines.  A minibuffer window is never a candidate.  A
478 dedicated window (@pxref{Dedicated Windows}) is never a candidate unless
479 the optional argument @var{dedicated} is non-@code{nil}.
481 If there are two candidate windows of the same size, this function
482 prefers the one that comes first in the cyclic ordering of windows,
483 starting from the selected window (@pxref{Cyclic Window Ordering}).
485 The optional argument @var{frame} specifies which set of windows to
486 consider, see @code{get-lru-window} above.
487 @end defun
489 @cindex window that satisfies a predicate
490 @cindex conditional selection of windows
491 @defun get-window-with-predicate predicate &optional minibuf all-frames default
492 This function returns a window satisfying @var{predicate}.  It cycles
493 through all visible windows using @code{walk-windows} (@pxref{Cyclic
494 Window Ordering}), calling @var{predicate} on each one of them with that
495 window as its argument.  The function returns the first window for which
496 @var{predicate} returns a non-@code{nil} value; if that never happens,
497 it returns @var{default} (which defaults to @code{nil}).
499 The optional arguments @var{minibuf} and @var{all-frames} specify the
500 set of windows to include in the scan.  See the description of
501 @code{next-window} in @ref{Cyclic Window Ordering}, for details.
502 @end defun
504 @node Cyclic Window Ordering
505 @comment  node-name,  next,  previous,  up
506 @section Cyclic Ordering of Windows
507 @cindex cyclic ordering of windows
508 @cindex ordering of windows, cyclic
509 @cindex window ordering, cyclic
511   When you use the command @kbd{C-x o} (@code{other-window}) to select
512 some other window, it moves through the windows on the screen in a
513 specific order.  For any given configuration of windows, this order
514 never varies.  It is called the @dfn{cyclic ordering of windows}.
516   For a particular frame, this ordering generally goes from top to
517 bottom, and from left to right.  But it may go down first or go right
518 first, depending on the order in which windows were split.
520   If the first split was vertical (into windows one above each other),
521 and then the subwindows were split horizontally, then the ordering is
522 left to right in the top of the frame, and then left to right in the
523 next lower part of the frame, and so on.  If the first split was
524 horizontal, the ordering is top to bottom in the left part, and so on.
525 In general, within each set of siblings at any level in the window tree
526 (@pxref{Window Tree}), the order is left to right, or top to bottom.
528 @defun next-window &optional window minibuf all-frames
529 @cindex minibuffer window, and @code{next-window}
530 This function returns the window following @var{window} in the cyclic
531 ordering of windows.  This is the window @kbd{C-x o} selects if typed
532 when @var{window} is selected.  The default for @var{window} is the
533 selected window.
535 The value of the optional argument @var{minibuf} specifies whether the
536 minibuffer is included in the window order.  Normally, when
537 @var{minibuf} is @code{nil}, the minibuffer is included only if it is
538 currently ``active''; this matches the behavior of @kbd{C-x o}.  (The
539 minibuffer window is active while the minibuffer is in use; see
540 @ref{Minibuffers}.)
542 If @var{minibuf} is @code{t}, the cyclic ordering includes the
543 minibuffer window even if it is not active.  If @var{minibuf} is neither
544 @code{t} nor @code{nil}, the minibuffer window is not included even if
545 it is active.
547 The optional argument @var{all-frames} specifies which frames to
548 consider.  Here are the possible values and their meanings:
550 @table @asis
551 @item @code{nil}
552 Consider all the windows in @var{window}'s frame, plus the minibuffer
553 used by that frame even if it lies in some other frame.  If the
554 minibuffer counts (as determined by @var{minibuf}), then all windows on
555 all frames that share that minibuffer count too.
557 @item @code{t}
558 Consider all windows in all existing frames.
560 @item @code{visible}
561 Consider all windows in all visible frames.  (To get useful results, you
562 must ensure @var{window} is in a visible frame.)
564 @item 0
565 Consider all windows in all visible or iconified frames.
567 @item a frame
568 Consider all windows on that frame.
570 @item anything else
571 Consider precisely the windows in @var{window}'s frame, and no others.
572 @end table
574 This example assumes there are two windows, both displaying the
575 buffer @samp{windows.texi}:
577 @example
578 @group
579 (selected-window)
580      @result{} #<window 56 on windows.texi>
581 @end group
582 @group
583 (next-window (selected-window))
584      @result{} #<window 52 on windows.texi>
585 @end group
586 @group
587 (next-window (next-window (selected-window)))
588      @result{} #<window 56 on windows.texi>
589 @end group
590 @end example
591 @end defun
593 @defun previous-window &optional window minibuf all-frames
594 This function returns the window preceding @var{window} in the cyclic
595 ordering of windows.  The other arguments specify which windows to
596 include in the cycle, as in @code{next-window}.
597 @end defun
599 @deffn Command other-window count &optional all-frames
600 This function selects another window in the cyclic ordering of windows.
601 @var{count} specifies the number of windows to skip in the ordering,
602 starting with the selected window, before making the selection.  If
603 @var{count} is a positive number, it skips @var{count} windows forwards.
604 @var{count} negative means skip @minus{}@var{count} windows backwards.
605 If @var{count} is zero, it does not skip any window, thus re-selecting
606 the selected window.  In an interactive call, @var{count} is the numeric
607 prefix argument.
609 The optional argument @var{all-frames} has the same meaning as in
610 @code{next-window}, but the @var{minibuf} argument of @code{next-window}
611 is always effectively @code{nil}.  This function returns @code{nil}.
612 @end deffn
614 @c Emacs 19 feature
615 @defun walk-windows proc &optional minibuf all-frames
616 This function cycles through all windows.  It calls the function
617 @code{proc} once for each window, with the window as its sole
618 argument.
620 The optional arguments @var{minibuf} and @var{all-frames} specify the
621 set of windows to include in the walk.  See @code{next-window}, above,
622 for details.
623 @end defun
625 @defun window-list &optional frame minibuf window
626 This function returns a list of all windows on @var{frame}, starting
627 with @var{window}.  The default for @var{frame} is the selected frame;
628 the default for @var{window} is the selected window.
630 The value of @var{minibuf} specifies if the minibuffer window shall be
631 included in the result list.  If @var{minibuf} is @code{t}, the result
632 always includes the minibuffer window.  If @var{minibuf} is @code{nil}
633 or omitted, that includes the minibuffer window if it is active.  If
634 @var{minibuf} is neither @code{nil} nor @code{t}, the result never
635 includes the minibuffer window.
636 @end defun
638 @node Buffers and Windows
639 @section Buffers and Windows
640 @cindex examining windows
641 @cindex windows, controlling precisely
642 @cindex buffers, controlled in windows
644   This section describes low-level functions to examine windows or to
645 display buffers in windows in a precisely controlled fashion.
646 @iftex
647 See the following section for
648 @end iftex
649 @ifnottex
650 @xref{Displaying Buffers}, for
651 @end ifnottex
652 related functions that find a window to use and specify a buffer for it.
653 The functions described there are easier to use, but they employ
654 heuristics in choosing or creating a window; use the functions described
655 here when you need complete control.
657 @defun set-window-buffer window buffer-or-name &optional keep-margins
658 This function makes @var{window} display @var{buffer-or-name} as its
659 contents.  It returns @code{nil}.  The default for @var{window} is the
660 selected window.  The argument @var{buffer-or-name} must specify a
661 buffer or the name of an existing buffer.
663 @code{set-window-buffer} is the fundamental primitive for changing which
664 buffer is displayed in a window, and all ways of doing that call this
665 function.
667 @example
668 @group
669 (set-window-buffer (selected-window) "foo")
670      @result{} nil
671 @end group
672 @end example
674 Normally, displaying @var{buffer-or-name} in @var{window} resets the
675 window's position, display margins, fringe widths, and scroll bar
676 settings based on the local variables of that buffer.
677 However, if @var{keep-margins} is non-@code{nil}, display margins and
678 fringe widths of @var{window} remain unchanged.  @xref{Fringes}.
680 @code{set-window-buffer} signals an error when @var{window} is
681 @dfn{strongly} dedicated to its buffer (@pxref{Dedicated Windows}) and
682 does not already display @var{buffer-or-name}.
684 Note that this function runs @code{window-scroll-functions} before
685 running @code{window-configuration-change-hook}.
686 @end defun
688 @defvar buffer-display-count
689 This buffer-local variable records the number of times a buffer has been
690 displayed in a window.  It is incremented each time
691 @code{set-window-buffer} is called for the buffer.
692 @end defvar
694 @defun window-buffer &optional window
695 This function returns the buffer that @var{window} is displaying.  The
696 default for @var{window} is the selected window.
698 @example
699 @group
700 (window-buffer)
701      @result{} #<buffer windows.texi>
702 @end group
703 @end example
704 @end defun
706 @defun get-buffer-window &optional buffer-or-name all-frames
707 This function returns a window currently displaying
708 @var{buffer-or-name}, or @code{nil} if there is none.  If there are
709 several such windows, then the function returns the first one in the
710 cyclic ordering of windows, starting from the selected window.
711 @xref{Cyclic Window Ordering}.
713 The argument @var{BUFFER-OR-NAME} may be a buffer or a buffer name and
714 defaults to the current buffer.  The optional argument @var{all-frames}
715 specifies which windows to consider:
717 @itemize @bullet
718 @item
719 @code{nil} means consider windows on the selected frame.
720 @item
721 @code{t} means consider windows on all existing frames.
722 @item
723 @code{visible} means consider windows on all visible frames.
724 @item
725 0 means consider windows on all visible or iconified frames.
726 @item
727 A frame means consider windows on that frame only.
728 @end itemize
730 Observe that the behavior of @code{get-buffer-window} may differ from
731 that of @code{next-window} (@pxref{Cyclic Window Ordering}) when
732 @var{all-frames} equals @code{nil} or any value not listed here.
733 Perhaps we will change @code{get-buffer-window} in the future to make it
734 compatible with the other functions.
735 @end defun
737 @defun get-buffer-window-list &optional buffer-or-name minibuf all-frames
738 This function returns a list of all windows currently displaying
739 @var{buffer-or-name}.  The argument @var{buffer-or-name} may be a buffer
740 or the name of an existing buffer and defaults to the current buffer.
742 The two remaining arguments work like the same-named arguments of
743 @code{next-window}; they are @emph{not} like the optional arguments of
744 @code{get-buffer-window}.
745 @end defun
747 @defvar buffer-display-time
748 This variable records the time at which a buffer was last made visible
749 in a window.  It is always local in each buffer; each time
750 @code{set-window-buffer} is called, it sets this variable to
751 @code{(current-time)} in the specified buffer (@pxref{Time of Day}).
752 When a buffer is first created, @code{buffer-display-time} starts out
753 with the value @code{nil}.
754 @end defvar
756 @node Displaying Buffers
757 @section Displaying Buffers in Windows
758 @cindex switching to a buffer
759 @cindex displaying a buffer
761   In this section we describe convenient functions that choose a window
762 automatically and use it to display a specified buffer.  These functions
763 can also split an existing window in certain circumstances.  We also
764 describe variables that parameterize the heuristics used for choosing a
765 window.
766 @iftex
767 See the preceding section for
768 @end iftex
769 @ifnottex
770 @xref{Buffers and Windows}, for
771 @end ifnottex
772 low-level primitives that give you more precise control.  All of these
773 functions work by calling @code{set-window-buffer}.
775   Do not use the functions in this section in order to make a buffer
776 current so that a Lisp program can access or modify it; they are too
777 drastic for that purpose, since they change the display of buffers in
778 windows, which would be gratuitous and surprise the user.  Instead, use
779 @code{set-buffer} and @code{save-current-buffer} (@pxref{Current
780 Buffer}), which designate buffers as current for programmed access
781 without affecting the display of buffers in windows.
783 @deffn Command switch-to-buffer buffer-or-name &optional norecord
784 This function makes @var{buffer-or-name} the current buffer, and also
785 displays the buffer in the selected window.  This means that a human can
786 see the buffer and subsequent keyboard commands will apply to it.
787 Contrast this with @code{set-buffer}, which makes @var{buffer-or-name}
788 the current buffer but does not display it in the selected window;
789 see @ref{Current Buffer}.
791 If @var{buffer-or-name} is @code{nil}, @code{switch-to-buffer} chooses a
792 buffer using @code{other-buffer}.  If @var{buffer-or-name} is a string
793 that does not identify an existing buffer, then a new buffer by that
794 name is created.  The major mode for the new buffer is set according to
795 the variable @code{major-mode}; see @ref{Auto Major Mode}.
797 When the selected window is the minibuffer window or is strongly
798 dedicated to its buffer (@pxref{Dedicated Windows}), this function calls
799 @code{pop-to-buffer} (see below) to display the buffer in some other
800 window.
802 Normally the specified buffer is put at the front of the buffer list
803 (both the selected frame's buffer list and the frame-independent buffer
804 list).  This affects the operation of @code{other-buffer}.  However, if
805 @var{norecord} is non-@code{nil}, this is not done.  @xref{The Buffer
806 List}.
808 The @code{switch-to-buffer} function is often used interactively, as
809 the binding of @kbd{C-x b}.  It is also used frequently in programs.  It
810 returns the buffer that it switched to.
811 @end deffn
813 The next two functions are similar to @code{switch-to-buffer}, except
814 for the described features.
816 @deffn Command switch-to-buffer-other-window buffer-or-name &optional norecord
817 This function makes the buffer specified by @var{buffer-or-name} current
818 and displays it in a window not currently selected, using the function
819 @code{pop-to-buffer} (see below).
821 The currently selected window is absolutely never used to do the job.
822 If the selected window already displays @var{buffer-or-name}, then it
823 continues to do so, but another window is nonetheless found to display
824 it in as well.
826 This function updates the buffer list just like @code{switch-to-buffer}
827 unless @var{norecord} is non-@code{nil}.
828 @end deffn
830 @deffn Command pop-to-buffer buffer-or-name &optional other-window norecord
831 This command makes @var{buffer-or-name} the current buffer and switches
832 to it in some window, preferably not the window previously selected.
833 The ``popped-to'' window becomes the selected window.  Its frame is
834 given the X server's focus, if possible; see @ref{Input Focus}.  The
835 return value is the buffer that was switched to.
837 If @var{buffer-or-name} is @code{nil}, that means to choose some other
838 buffer, but you don't specify which.  If @var{buffer-or-name} is a
839 string that does not name an existing buffer, a buffer by that name is
840 created.  The major mode for the new buffer is set according to the
841 variable @code{major-mode}.  @xref{Auto Major Mode}.
843 If either of the variables @code{display-buffer-reuse-frames} or
844 @code{pop-up-frames} is non-@code{nil}, @code{pop-to-buffer} looks for a
845 window in any visible frame already displaying the buffer; if there is
846 one, it selects and returns that window.  If no such window exists and
847 @code{pop-up-frames} is non-@code{nil}, it creates a new frame and
848 displays the buffer in it.  Otherwise, @code{pop-to-buffer} operates
849 entirely within the selected frame.  (If the selected frame has just a
850 minibuffer, @code{pop-to-buffer} operates within the most recently
851 selected frame that was not just a minibuffer.)
853 If the variable @code{pop-up-windows} is non-@code{nil}, windows may be
854 split to create a new window that is different from the original window.
855 For details, see @ref{Choosing Window}.
857 If @var{other-window} is non-@code{nil}, @code{pop-to-buffer} finds or
858 creates another window even if @var{buffer-or-name} is already visible
859 in the selected window.  Thus @var{buffer-or-name} could end up
860 displayed in two windows.  On the other hand, if @var{buffer-or-name} is
861 already displayed in the selected window and @var{other-window} is
862 @code{nil}, then the selected window is considered sufficient for
863 displaying @var{buffer-or-name}, so that nothing needs to be done.
865 All the variables that affect @code{display-buffer} affect
866 @code{pop-to-buffer} as well.  @xref{Choosing Window}.
868 This function updates the buffer list just like @code{switch-to-buffer}
869 unless @var{norecord} is non-@code{nil}.
870 @end deffn
872 @deffn Command replace-buffer-in-windows &optional buffer-or-name
873 This function replaces @var{buffer-or-name} in all windows displaying
874 it with some other buffer.  It uses @code{other-buffer} to choose the
875 other buffer.  In the usual applications of this function, you
876 don't care which other buffer is used; you just want to make sure that
877 @var{buffer-or-name} is no longer displayed.
879 The argument @var{buffer-or-name} may be a buffer or the name of an
880 existing buffer and defaults to the current buffer.
882 If a window displaying @var{buffer-or-name} is dedicated
883 (@pxref{Dedicated Windows}), and is not the only window on its frame,
884 that window is deleted.  If that window is the only window on its frame
885 and there are other frames left, the window's frame is deleted too.  If
886 there are no other frames left, some other buffer is displayed in that
887 window.
889 This function returns @code{nil}.
890 @end deffn
892 @node Choosing Window
893 @section Choosing a Window for Display
895   This section describes the basic facility that chooses a window to
896 display a buffer in---@code{display-buffer}.  Higher-level functions and
897 commands, like @code{switch-to-buffer} and @code{pop-to-buffer}, use this
898 subroutine.  Here we describe how to use @code{display-buffer} and how
899 to customize it.
901 @deffn Command display-buffer buffer-or-name &optional not-this-window frame
902 This command makes @var{buffer-or-name} appear in some window, but it
903 does not select that window and does not make the buffer specified by
904 @var{buffer-or-name} current.  The identity of the selected window is
905 unaltered by this function.  The argument @var{buffer-or-name} must be a
906 buffer or the name of an existing buffer.
908 @var{not-this-window} non-@code{nil} means to display the specified
909 buffer in a window other than the selected one, even if it is already
910 displayed in the selected window.  This can cause the buffer to appear
911 in two windows at once.  Otherwise, if @var{buffer-or-name} is already
912 being displayed in any window, that is good enough, so this function
913 does nothing.
915 @code{display-buffer} returns the window chosen to display
916 @var{buffer-or-name}.
918 If the optional argument @var{frame} is non-@code{nil}, it specifies
919 which frames to check when deciding whether the buffer is already
920 displayed.  If the buffer is already displayed in some window on one of
921 these frames, @code{display-buffer} simply returns that window.  Here
922 are the possible values of @var{frame}:
924 @itemize @bullet
925 @item
926 @code{nil} means consider windows on the selected frame.
927 (Actually, the last non-minibuffer frame.)
928 @item
929 @code{t} means consider windows on all frames.
930 @item
931 @code{visible} means consider windows on all visible frames.
932 @item
933 0 means consider windows on all visible or iconified frames.
934 @item
935 A frame means consider windows on that frame only.
936 @end itemize
938 Precisely how @code{display-buffer} finds or creates a window depends on
939 the variables described below.
940 @end deffn
942 @defopt display-buffer-reuse-frames
943 If this variable is non-@code{nil}, @code{display-buffer} searches
944 visible and iconified frames for a window displaying
945 @var{buffer-or-name}.  If there is such a window, @code{display-buffer}
946 makes that window's frame visible and raises it if necessary, and
947 returns the window.  If there is no such window or
948 @code{display-buffer-reuse-frames} is @code{nil}, the behavior of
949 @code{display-buffer} is determined by the variables described next.
950 @end defopt
952 @defopt pop-up-windows
953 This variable specifies whether @code{display-buffer} is allowed to
954 split (@pxref{Splitting Windows}) an existing window.  If this variable
955 is non-@code{nil}, @code{display-buffer} tries to split the largest or
956 least recently used window on the selected frame.  (If the selected
957 frame is a minibuffer-only frame, @code{display-buffer} tries to split a
958 window on another frame instead.)  If this variable is @code{nil} or the
959 variable @code{pop-up-frames} (see below) is non-@code{nil},
960 @code{display-buffer} does not split any window.
961 @end defopt
963 @defopt split-window-preferred-function
964 This variable must specify a function with one argument, which is a
965 window.  The @code{display-buffer} routines will call this function with
966 one or more candidate windows when they look for a window to split.  The
967 function is expected to split that window and return the new window.  If
968 the function returns @code{nil}, this means that the argument window
969 cannot (or shall not) be split.
971 The default value of @code{split-window-preferred-function} is the
972 function @code{split-window-sensibly} described below.  If you
973 customize this option, bear in mind that the @code{display-buffer}
974 routines may call your function up to two times when trying to split a
975 window.  The argument of the first call is the largest window on the
976 chosen frame (as returned by @code{get-largest-window}).  If that call
977 fails to return a live window, your function is called a second time
978 with the least recently used window on that frame (as returned by
979 @code{get-lru-window}).
981 The function specified by this option may try to split any other window
982 instead of the argument window.  Note that the window selected at the
983 time @code{display-buffer} was invoked is still selected when your
984 function is called.  Hence, you can split the selected window (instead
985 of the largest or least recently used one) by simply ignoring the window
986 argument in the body of your function.  You can even choose to not split
987 any window as long as the return value of your function specifies a live
988 window or @code{nil}, but you are not encouraged to do so
989 unconditionally.  If you want @code{display-buffer} to never split any
990 windows, set @code{pop-up-windows} to @code{nil}.
991 @end defopt
993 @defun split-window-sensibly window
994 This function takes a window as argument and tries to split that window
995 in a suitable way.  The two variables described next are useful for
996 tuning the behavior of this function.
997 @end defun
999 @defopt split-height-threshold
1000 This variable specifies whether @code{split-window-sensibly} may split
1001 windows vertically.  If it is an integer, @code{split-window-sensibly}
1002 tries to vertically split a window only if it has at least this many
1003 lines.  If the window has less lines, splitting fails, or the value of
1004 this variable is @code{nil}, @code{split-window-sensibly} will try to
1005 split the window horizontally, subject to restrictions of
1006 @code{split-width-threshold} (see below).  If splitting horizontally
1007 fails too and the window is the only window on its frame,
1008 @code{split-window-sensibly} will try to split the window vertically
1009 disregarding the value of @code{split-height-threshold}.  If this fails
1010 as well, @code{split-window-sensibly} returns @code{nil}.
1012 @code{split-window-sensibly} does not split vertically a window whose
1013 height is fixed (@pxref{Resizing Windows}).  Also, it vertically splits
1014 a window only if the space taken up by that window can accommodate two
1015 windows one above the other that are both at least
1016 @code{window-min-height} lines tall.  Moreover, if the window that shall
1017 be split has a mode line, @code{split-window-sensibly} does not split
1018 the window unless the new window can accommodate a mode line too.
1019 @end defopt
1021 @defopt split-width-threshold
1022 This variable specifies whether @code{split-window-sensibly} may split
1023 windows horizontally.  If it is an integer, @code{split-window-sensibly}
1024 tries to horizontally split a window only if it has at least this many
1025 columns.  If it is @code{nil}, @code{split-window-sensibly} will not
1026 split the window horizontally.  (It still might split the window
1027 vertically, though, see above.)
1029 @code{split-window-sensibly} does not split horizontally a window if
1030 that window's width is fixed (@pxref{Resizing Windows}).  Also, it
1031 horizontally splits a window only if the space that window takes up can
1032 accommodate two windows side by side that are both at least
1033 @code{window-min-width} columns wide.
1034 @end defopt
1036 @defopt even-window-heights
1037 This variable specifies whether @code{display-buffer} should even out
1038 window heights if the buffer gets displayed in an existing window, above
1039 or beneath another window.  If @code{even-window-heights} is
1040 non-@code{nil}, the default, window heights will be evened out.  If
1041 either of the involved window has fixed height (@pxref{Resizing
1042 Windows}) or @code{even-window-heights} is @code{nil}, the original
1043 window heights will be left alone.
1044 @end defopt
1046 @c Emacs 19 feature
1047 @defopt pop-up-frames
1048 This variable specifies whether @code{display-buffer} should make new
1049 frames.  If it is non-@code{nil}, @code{display-buffer} looks for a
1050 window already displaying @var{buffer-or-name} on any visible or
1051 iconified frame.  If it finds such a window, it makes that window's
1052 frame visible and raises it if necessary, and returns the window.
1053 Otherwise it makes a new frame, unless the variable's value is
1054 @code{graphic-only} and the selected frame is not on a graphic display.
1055 @xref{Frames}, for more information.
1057 Note that the value of @code{pop-up-windows} does not matter if
1058 @code{pop-up-frames} is non-@code{nil}.  If @code{pop-up-frames} is
1059 @code{nil}, then @code{display-buffer} either splits a window or reuses
1060 one.
1061 @end defopt
1063 @c Emacs 19 feature
1064 @defopt pop-up-frame-function
1065 This variable specifies how to make a new frame if @code{pop-up-frames}
1066 is non-@code{nil}.
1068 The value of this variable must be a function of no arguments.  When
1069 @code{display-buffer} makes a new frame, it does so by calling that
1070 function, which should return a frame.  The default value of this
1071 variable is a function that creates a frame using the parameters
1072 specified by @code{pop-up-frame-alist} described next.
1073 @end defopt
1075 @defopt pop-up-frame-alist
1076 This variable holds an alist specifying frame parameters used by the
1077 default value of @code{pop-up-frame-function} for making new frames.
1078 @xref{Frame Parameters}, for more information about frame parameters.
1079 @end defopt
1081 @defopt special-display-buffer-names
1082 A list of buffer names identifying buffers that should be displayed
1083 specially.  If the name of @var{buffer-or-name} is in this list,
1084 @code{display-buffer} handles the buffer specially.  By default, special
1085 display means to give the buffer a dedicated frame.
1087 If an element is a list, instead of a string, then the @sc{car} of that
1088 list is the buffer name, and the rest of that list says how to create
1089 the frame.  There are two possibilities for the rest of that list (its
1090 @sc{cdr}): It can be an alist, specifying frame parameters, or it can
1091 contain a function and arguments to give to it.  (The function's first
1092 argument is always the buffer to be displayed; the arguments from the
1093 list come after that.)
1095 For example:
1097 @example
1098 (("myfile" (minibuffer) (menu-bar-lines . 0)))
1099 @end example
1101 @noindent
1102 specifies to display a buffer named @samp{myfile} in a dedicated frame
1103 with specified @code{minibuffer} and @code{menu-bar-lines} parameters.
1105 The list of frame parameters can also use the phony frame parameters
1106 @code{same-frame} and @code{same-window}.  If the specified frame
1107 parameters include @code{(same-window . @var{value})} and @var{value}
1108 is non-@code{nil}, that means to display the buffer in the current
1109 selected window.  Otherwise, if they include @code{(same-frame .
1110 @var{value})} and @var{value} is non-@code{nil}, that means to display
1111 the buffer in a new window in the currently selected frame.
1112 @end defopt
1114 @defopt special-display-regexps
1115 A list of regular expressions specifying buffers that should be
1116 displayed specially.  If the buffer's name matches any of the regular
1117 expressions in this list, @code{display-buffer} handles the buffer
1118 specially.  By default, special display means to give the buffer a
1119 dedicated frame.
1121 If an element is a list, instead of a string, then the @sc{car} of the
1122 list is the regular expression, and the rest of the list says how to
1123 create the frame.  See @code{special-display-buffer-names} above.
1124 @end defopt
1126 @defun special-display-p buffer-name
1127 This function returns non-@code{nil} if displaying a buffer
1128 named @var{buffer-name} with @code{display-buffer} would
1129 create a special frame.  The value is @code{t} if it would
1130 use the default frame parameters, or else the specified list
1131 of frame parameters.
1132 @end defun
1134 @defopt special-display-function
1135 This variable holds the function to call to display a buffer specially.
1136 It receives the buffer as an argument, and should return the window in
1137 which it is displayed.  The default value of this variable is
1138 @code{special-display-popup-frame}, see below.
1139 @end defopt
1141 @defun special-display-popup-frame buffer &optional args
1142 This function tries to make @var{buffer} visible in a frame of its own.
1143 If @var{buffer} is already displayed in some window, it makes that
1144 window's frame visible and raises it.  Otherwise, it creates a frame
1145 that is dedicated to @var{buffer}.  The return value is the window used
1146 to display @var{buffer}.
1148 If @var{args} is an alist, it specifies frame parameters for the new
1149 frame.  If @var{args} is a list whose @sc{car} is a symbol, then
1150 @code{(car @var{args})} is called as a function to actually create and
1151 set up the frame; it is called with @var{buffer} as first argument, and
1152 @code{(cdr @var{args})} as additional arguments.
1154 This function always uses an existing window displaying @var{buffer},
1155 whether or not it is in a frame of its own; but if you set up the above
1156 variables in your init file, before @var{buffer} was created, then
1157 presumably the window was previously made by this function.
1158 @end defun
1160 @defopt special-display-frame-alist
1161 @anchor{Definition of special-display-frame-alist}
1162 This variable holds frame parameters for
1163 @code{special-display-popup-frame} to use when it creates a frame.
1164 @end defopt
1166 @defopt same-window-buffer-names
1167 A list of buffer names for buffers that should be displayed in the
1168 selected window.  If the buffer's name is in this list,
1169 @code{display-buffer} handles the buffer by switching to it in the
1170 selected window.
1171 @end defopt
1173 @defopt same-window-regexps
1174 A list of regular expressions that specify buffers that should be
1175 displayed in the selected window.  If the buffer's name matches any of
1176 the regular expressions in this list, @code{display-buffer} handles the
1177 buffer by switching to it in the selected window.
1178 @end defopt
1180 @defun same-window-p buffer-name
1181 This function returns @code{t} if displaying a buffer
1182 named @var{buffer-name} with @code{display-buffer} would
1183 put it in the selected window.
1184 @end defun
1186 @c Emacs 19 feature
1187 @defopt display-buffer-function
1188 This variable is the most flexible way to customize the behavior of
1189 @code{display-buffer}.  If it is non-@code{nil}, it should be a function
1190 that @code{display-buffer} calls to do the work.  The function should
1191 accept two arguments, the first two arguments that @code{display-buffer}
1192 received.  It should choose or create a window, display the specified
1193 buffer in it, and then return the window.
1195 This variable takes precedence over all the other options described
1196 above.
1197 @end defopt
1199 If all options described above fail to produce a suitable window,
1200 @code{display-buffer} tries to reuse an existing window.  As a last
1201 resort, it will try to display @var{buffer-or-name} on a separate frame.
1202 In that case, the value of @code{pop-up-frames} is disregarded.
1204 @node Dedicated Windows
1205 @section Dedicated Windows
1206 @cindex dedicated window
1208 Functions for displaying a buffer can be told to not use specific
1209 windows by marking these windows as @dfn{dedicated} to their buffers.
1210 @code{display-buffer} (@pxref{Choosing Window}) never uses a dedicated
1211 window for displaying another buffer in it.  @code{get-lru-window} and
1212 @code{get-largest-window} (@pxref{Selecting Windows}) do not consider
1213 dedicated windows as candidates when their @var{dedicated} argument is
1214 non-@code{nil}.  The behavior of @code{set-window-buffer}
1215 (@pxref{Buffers and Windows}) with respect to dedicated windows is
1216 slightly different, see below.
1218 When @code{delete-windows-on} (@pxref{Deleting Windows}) wants to delete
1219 a dedicated window and that window is the only window on its frame, it
1220 deletes the window's frame too, provided there are other frames left.
1221 @code{replace-buffer-in-windows} (@pxref{Displaying Buffers}) tries to
1222 delete all dedicated windows showing its buffer argument.  When such a
1223 window is the only window on its frame, that frame is deleted, provided
1224 there are other frames left.  If there are no more frames left, some
1225 other buffer is displayed in the window, and the window is marked as
1226 non-dedicated.
1228 When you kill a buffer (@pxref{Killing Buffers}) displayed in a
1229 dedicated window, any such window usually gets deleted too, since
1230 @code{kill-buffer} calls @code{replace-buffer-in-windows} for cleaning
1231 up windows.  Burying a buffer (@pxref{The Buffer List}) deletes the
1232 selected window if it is dedicated to that buffer.  If, however, that
1233 window is the only window on its frame, @code{bury-buffer} displays
1234 another buffer in it and iconifies the frame.
1236 @defun window-dedicated-p &optional window
1237 This function returns non-@code{nil} if @var{window} is dedicated to its
1238 buffer and @code{nil} otherwise.  More precisely, the return value is
1239 the value assigned by the last call of @code{set-window-dedicated-p} for
1240 @var{window} or @code{nil} if that function was never called with
1241 @var{window} as its argument.  The default for @var{window} is the
1242 selected window.
1243 @end defun
1245 @defun set-window-dedicated-p window flag
1246 This function marks @var{window} as dedicated to its buffer if
1247 @var{flag} is non-@code{nil}, and non-dedicated otherwise.
1249 As a special case, if @var{flag} is @code{t}, @var{window} becomes
1250 @dfn{strongly} dedicated to its buffer.  @code{set-window-buffer}
1251 signals an error when the window it acts upon is strongly dedicated to
1252 its buffer and does not already display the buffer it is asked to
1253 display.  Other functions do not treat @code{t} differently from any
1254 non-@code{nil} value.
1255 @end defun
1257 @node Window Point
1258 @section Windows and Point
1259 @cindex window position
1260 @cindex window point
1261 @cindex position in window
1262 @cindex point in window
1264   Each window has its own value of point (@pxref{Point}), independent of
1265 the value of point in other windows displaying the same buffer.  This
1266 makes it useful to have multiple windows showing one buffer.
1268 @itemize @bullet
1269 @item
1270 The window point is established when a window is first created; it is
1271 initialized from the buffer's point, or from the window point of another
1272 window opened on the buffer if such a window exists.
1274 @item
1275 Selecting a window sets the value of point in its buffer from the
1276 window's value of point.  Conversely, deselecting a window sets the
1277 window's value of point from that of the buffer.  Thus, when you switch
1278 between windows that display a given buffer, the point value for the
1279 selected window is in effect in the buffer, while the point values for
1280 the other windows are stored in those windows.
1282 @item
1283 As long as the selected window displays the current buffer, the window's
1284 point and the buffer's point always move together; they remain equal.
1285 @end itemize
1287 @cindex cursor
1288    As far as the user is concerned, point is where the cursor is, and
1289 when the user switches to another buffer, the cursor jumps to the
1290 position of point in that buffer.
1292 @defun window-point &optional window
1293 This function returns the current position of point in @var{window}.
1294 For a nonselected window, this is the value point would have (in that
1295 window's buffer) if that window were selected.  The default for
1296 @var{window} is the selected window.
1298 When @var{window} is the selected window and its buffer is also the
1299 current buffer, the value returned is the same as point in that buffer.
1300 Strictly speaking, it would be more correct to return the ``top-level''
1301 value of point, outside of any @code{save-excursion} forms.  But that
1302 value is hard to find.
1303 @end defun
1305 @defun set-window-point window position
1306 This function positions point in @var{window} at position
1307 @var{position} in @var{window}'s buffer.  It returns @var{position}.
1309 If @var{window} is selected, and its buffer is current,
1310 this simply does @code{goto-char}.
1311 @end defun
1313 @defvar window-point-insertion-type
1314 This variable specifies the marker insertion type (@pxref{Marker
1315 Insertion Types}) of @code{window-point}.  The default is @code{nil},
1316 so @code{window-point} will stay behind text inserted there.
1317 @end defvar
1319 @node Window Start and End
1320 @section The Window Start and End Positions
1321 @cindex window start position
1323   Each window maintains a marker used to keep track of a buffer position
1324 that specifies where in the buffer display should start.  This position
1325 is called the @dfn{display-start} position of the window (or just the
1326 @dfn{start}).  The character after this position is the one that appears
1327 at the upper left corner of the window.  It is usually, but not
1328 inevitably, at the beginning of a text line.
1330   After switching windows or buffers, and in some other cases, if the
1331 window start is in the middle of a line, Emacs adjusts the window
1332 start to the start of a line.  This prevents certain operations from
1333 leaving the window start at a meaningless point within a line.  This
1334 feature may interfere with testing some Lisp code by executing it
1335 using the commands of Lisp mode, because they trigger this
1336 readjustment.  To test such code, put it into a command and bind the
1337 command to a key.
1339 @defun window-start &optional window
1340 @cindex window top line
1341 This function returns the display-start position of window
1342 @var{window}.  If @var{window} is @code{nil}, the selected window is
1343 used.  For example,
1345 @example
1346 @group
1347 (window-start)
1348      @result{} 7058
1349 @end group
1350 @end example
1352 When you create a window, or display a different buffer in it, the
1353 display-start position is set to a display-start position recently used
1354 for the same buffer, or to @code{point-min} if the buffer doesn't have
1355 any.
1357 Redisplay updates the window-start position (if you have not specified
1358 it explicitly since the previous redisplay)---to make sure point appears
1359 on the screen.  Nothing except redisplay automatically changes the
1360 window-start position; if you move point, do not expect the window-start
1361 position to change in response until after the next redisplay.
1363 For a realistic example of using @code{window-start}, see the
1364 description of @code{count-lines}.  @xref{Definition of count-lines}.
1365 @end defun
1367 @cindex window end position
1368 @defun window-end &optional window update
1369 This function returns the position where display of its buffer ends in
1370 @var{window}.  The default for @var{window} is the selected window.
1372 Simply changing the buffer text or moving point does not update the
1373 value that @code{window-end} returns.  The value is updated only when
1374 Emacs redisplays and redisplay completes without being preempted.
1376 If the last redisplay of @var{window} was preempted, and did not finish,
1377 Emacs does not know the position of the end of display in that window.
1378 In that case, this function returns @code{nil}.
1380 If @var{update} is non-@code{nil}, @code{window-end} always returns an
1381 up-to-date value for where display ends, based on the current
1382 @code{window-start} value.  If a previously saved value of that position
1383 is still valid, @code{window-end} returns that value; otherwise it
1384 computes the correct value by scanning the buffer text.
1386 Even if @var{update} is non-@code{nil}, @code{window-end} does not
1387 attempt to scroll the display if point has moved off the screen, the
1388 way real redisplay would do.  It does not alter the
1389 @code{window-start} value.  In effect, it reports where the displayed
1390 text will end if scrolling is not required.
1391 @end defun
1393 @defun set-window-start window position &optional noforce
1394 This function sets the display-start position of @var{window} to
1395 @var{position} in @var{window}'s buffer.  It returns @var{position}.
1397 The display routines insist that the position of point be visible when a
1398 buffer is displayed.  Normally, they change the display-start position
1399 (that is, scroll the window) whenever necessary to make point visible.
1400 However, if you specify the start position with this function using
1401 @code{nil} for @var{noforce}, it means you want display to start at
1402 @var{position} even if that would put the location of point off the
1403 screen.  If this does place point off screen, the display routines move
1404 point to the left margin on the middle line in the window.
1406 For example, if point @w{is 1} and you set the start of the window
1407 @w{to 37}, the start of the next line, point will be ``above'' the top
1408 of the window.  The display routines will automatically move point if
1409 it is still 1 when redisplay occurs.  Here is an example:
1411 @example
1412 @group
1413 ;; @r{Here is what @samp{foo} looks like before executing}
1414 ;;   @r{the @code{set-window-start} expression.}
1415 @end group
1417 @group
1418 ---------- Buffer: foo ----------
1419 @point{}This is the contents of buffer foo.
1425 ---------- Buffer: foo ----------
1426 @end group
1428 @group
1429 (set-window-start
1430  (selected-window)
1431  (save-excursion
1432    (goto-char 1)
1433    (forward-line 1)
1434    (point)))
1435 @result{} 37
1436 @end group
1438 @group
1439 ;; @r{Here is what @samp{foo} looks like after executing}
1440 ;;   @r{the @code{set-window-start} expression.}
1441 ---------- Buffer: foo ----------
1444 @point{}4
1447 ---------- Buffer: foo ----------
1448 @end group
1449 @end example
1451 If @var{noforce} is non-@code{nil}, and @var{position} would place point
1452 off screen at the next redisplay, then redisplay computes a new window-start
1453 position that works well with point, and thus @var{position} is not used.
1454 @end defun
1456 @defun pos-visible-in-window-p &optional position window partially
1457 This function returns non-@code{nil} if @var{position} is within the
1458 range of text currently visible on the screen in @var{window}.  It
1459 returns @code{nil} if @var{position} is scrolled vertically out of view.
1460 Locations that are partially obscured are not considered visible unless
1461 @var{partially} is non-@code{nil}.  The argument @var{position} defaults
1462 to the current position of point in @var{window}; @var{window}, to the
1463 selected window.  If @var{position} is @code{t}, that means to check the
1464 last visible position in @var{window}.
1466 This function considers only vertical scrolling.  If @var{position} is
1467 out of view only because @var{window} has been scrolled horizontally,
1468 @code{pos-visible-in-window-p} returns non-@code{nil} anyway.
1469 @xref{Horizontal Scrolling}.
1471 If @var{position} is visible, @code{pos-visible-in-window-p} returns
1472 @code{t} if @var{partially} is @code{nil}; if @var{partially} is
1473 non-@code{nil}, and the character following @var{position} is fully
1474 visible, it returns a list of the form @code{(@var{x} @var{y})}, where
1475 @var{x} and @var{y} are the pixel coordinates relative to the top left
1476 corner of the window; otherwise it returns an extended list of the form
1477 @code{(@var{x} @var{y} @var{rtop} @var{rbot} @var{rowh} @var{vpos})},
1478 where @var{rtop} and @var{rbot} specify the number of off-window pixels
1479 at the top and bottom of the row at @var{position}, @var{rowh} specifies
1480 the visible height of that row, and @var{vpos} specifies the vertical
1481 position (zero-based row number) of that row.
1483 Here is an example:
1485 @example
1486 @group
1487 ;; @r{If point is off the screen now, recenter it now.}
1488 (or (pos-visible-in-window-p
1489      (point) (selected-window))
1490     (recenter 0))
1491 @end group
1492 @end example
1493 @end defun
1495 @defun window-line-height &optional line window
1496 This function returns the height of text line @var{line} in
1497 @var{window}.  If @var{line} is one of @code{header-line} or
1498 @code{mode-line}, @code{window-line-height} returns information about
1499 the corresponding line of the window.  Otherwise, @var{line} is a text
1500 line number starting from 0.  A negative number counts from the end of
1501 the window.  The default for @var{line} is the current line in
1502 @var{window}; the default for @var{window} is the selected window.
1504 If the display is not up to date, @code{window-line-height} returns
1505 @code{nil}.  In that case, @code{pos-visible-in-window-p} may be used
1506 to obtain related information.
1508 If there is no line corresponding to the specified @var{line},
1509 @code{window-line-height} returns @code{nil}.  Otherwise, it returns
1510 a list @code{(@var{height} @var{vpos} @var{ypos} @var{offbot})},
1511 where @var{height} is the height in pixels of the visible part of the
1512 line, @var{vpos} and @var{ypos} are the vertical position in lines and
1513 pixels of the line relative to the top of the first text line, and
1514 @var{offbot} is the number of off-window pixels at the bottom of the
1515 text line.  If there are off-window pixels at the top of the (first)
1516 text line, @var{ypos} is negative.
1517 @end defun
1519 @node Textual Scrolling
1520 @section Textual Scrolling
1521 @cindex textual scrolling
1522 @cindex scrolling textually
1524   @dfn{Textual scrolling} means moving the text up or down through a
1525 window.  It works by changing the value of the window's display-start
1526 location.  It may also change the value of @code{window-point} to keep
1527 point on the screen.
1529   Textual scrolling was formerly called ``vertical scrolling,'' but we
1530 changed its name to distinguish it from the new vertical fractional
1531 scrolling feature (@pxref{Vertical Scrolling}).
1533   In the commands @code{scroll-up} and @code{scroll-down}, the directions
1534 ``up'' and ``down'' refer to the motion of the text in the buffer at which
1535 you are looking through the window.  Imagine that the text is
1536 written on a long roll of paper and that the scrolling commands move the
1537 paper up and down.  Thus, if you are looking at text in the middle of a
1538 buffer and repeatedly call @code{scroll-down}, you will eventually see
1539 the beginning of the buffer.
1541   Some people have urged that the opposite convention be used: they
1542 imagine that the window moves over text that remains in place.  Then
1543 ``down'' commands would take you to the end of the buffer.  This view is
1544 more consistent with the actual relationship between windows and the
1545 text in the buffer, but it is less like what the user sees.  The
1546 position of a window on the terminal does not move, and short scrolling
1547 commands clearly move the text up or down on the screen.  We have chosen
1548 names that fit the user's point of view.
1550   The textual scrolling functions (aside from
1551 @code{scroll-other-window}) have unpredictable results if the current
1552 buffer is different from the buffer that is displayed in the selected
1553 window.  @xref{Current Buffer}.
1555   If the window contains a row which is taller than the height of the
1556 window (for example in the presence of a large image), the scroll
1557 functions will adjust the window's vertical scroll position to scroll
1558 the partially visible row.  To disable this feature, Lisp code may bind
1559 the variable @code{auto-window-vscroll} to @code{nil} (@pxref{Vertical
1560 Scrolling}).
1562 @deffn Command scroll-up &optional count
1563 This function scrolls the text in the selected window upward
1564 @var{count} lines.  If @var{count} is negative, scrolling is actually
1565 downward.
1567 If @var{count} is @code{nil} (or omitted), then the length of scroll
1568 is @code{next-screen-context-lines} lines less than the usable height of
1569 the window (not counting its mode line).
1571 @code{scroll-up} returns @code{nil}, unless it gets an error
1572 because it can't scroll any further.
1573 @end deffn
1575 @deffn Command scroll-down &optional count
1576 This function scrolls the text in the selected window downward
1577 @var{count} lines.  If @var{count} is negative, scrolling is actually
1578 upward.
1580 If @var{count} is omitted or @code{nil}, then the length of the scroll
1581 is @code{next-screen-context-lines} lines less than the usable height of
1582 the window (not counting its mode line).
1584 @code{scroll-down} returns @code{nil}, unless it gets an error because
1585 it can't scroll any further.
1586 @end deffn
1588 @deffn Command scroll-other-window &optional count
1589 This function scrolls the text in another window upward @var{count}
1590 lines.  Negative values of @var{count}, or @code{nil}, are handled
1591 as in @code{scroll-up}.
1593 You can specify which buffer to scroll by setting the variable
1594 @code{other-window-scroll-buffer} to a buffer.  If that buffer isn't
1595 already displayed, @code{scroll-other-window} displays it in some
1596 window.
1598 When the selected window is the minibuffer, the next window is normally
1599 the one at the top left corner.  You can specify a different window to
1600 scroll, when the minibuffer is selected, by setting the variable
1601 @code{minibuffer-scroll-window}.  This variable has no effect when any
1602 other window is selected.  When it is non-@code{nil} and the
1603 minibuffer is selected, it takes precedence over
1604 @code{other-window-scroll-buffer}.  @xref{Definition of
1605 minibuffer-scroll-window}.
1607 When the minibuffer is active, it is the next window if the selected
1608 window is the one at the bottom right corner.  In this case,
1609 @code{scroll-other-window} attempts to scroll the minibuffer.  If the
1610 minibuffer contains just one line, it has nowhere to scroll to, so the
1611 line reappears after the echo area momentarily displays the message
1612 @samp{Beginning of buffer}.
1613 @end deffn
1615 @c Emacs 19 feature
1616 @defvar other-window-scroll-buffer
1617 If this variable is non-@code{nil}, it tells @code{scroll-other-window}
1618 which buffer's window to scroll.
1619 @end defvar
1621 @defopt scroll-margin
1622 This option specifies the size of the scroll margin---a minimum number
1623 of lines between point and the top or bottom of a window.  Whenever
1624 point gets within this many lines of the top or bottom of the window,
1625 redisplay scrolls the text automatically (if possible) to move point
1626 out of the margin, closer to the center of the window.
1627 @end defopt
1629 @defopt scroll-conservatively
1630 This variable controls how scrolling is done automatically when point
1631 moves off the screen (or into the scroll margin).  If the value is a
1632 positive integer @var{n}, then redisplay scrolls the text up to
1633 @var{n} lines in either direction, if that will bring point back into
1634 proper view.  This behavior is called @dfn{conservative scrolling}.
1635 Otherwise, scrolling happens in the usual way, under the control of
1636 other variables such as @code{scroll-up-aggressively} and
1637 @code{scroll-down-aggressively}.
1639 The default value is zero, which means that conservative scrolling
1640 never happens.
1641 @end defopt
1643 @defopt scroll-down-aggressively
1644 The value of this variable should be either @code{nil} or a fraction
1645 @var{f} between 0 and 1.  If it is a fraction, that specifies where on
1646 the screen to put point when scrolling down.  More precisely, when a
1647 window scrolls down because point is above the window start, the new
1648 start position is chosen to put point @var{f} part of the window
1649 height from the top.  The larger @var{f}, the more aggressive the
1650 scrolling.
1652 A value of @code{nil} is equivalent to .5, since its effect is to center
1653 point.  This variable automatically becomes buffer-local when set in any
1654 fashion.
1655 @end defopt
1657 @defopt scroll-up-aggressively
1658 Likewise, for scrolling up.  The value, @var{f}, specifies how far
1659 point should be placed from the bottom of the window; thus, as with
1660 @code{scroll-up-aggressively}, a larger value scrolls more aggressively.
1661 @end defopt
1663 @defopt scroll-step
1664 This variable is an older variant of @code{scroll-conservatively}.
1665 The difference is that if its value is @var{n}, that permits scrolling
1666 only by precisely @var{n} lines, not a smaller number.  This feature
1667 does not work with @code{scroll-margin}.  The default value is zero.
1668 @end defopt
1670 @defopt scroll-preserve-screen-position
1671 If this option is @code{t}, scrolling which would move the current
1672 point position out of the window chooses the new position of point
1673 so that the vertical position of the cursor is unchanged, if possible.
1675 If it is non-@code{nil} and not @code{t}, then the scrolling functions
1676 always preserve the vertical position of point, if possible.
1677 @end defopt
1679 @defopt next-screen-context-lines
1680 The value of this variable is the number of lines of continuity to
1681 retain when scrolling by full screens.  For example, @code{scroll-up}
1682 with an argument of @code{nil} scrolls so that this many lines at the
1683 bottom of the window appear instead at the top.  The default value is
1684 @code{2}.
1685 @end defopt
1687 @deffn Command recenter &optional count
1688 @cindex centering point
1689 This function scrolls the text in the selected window so that point is
1690 displayed at a specified vertical position within the window.  It does
1691 not ``move point'' with respect to the text.
1693 If @var{count} is a nonnegative number, that puts the line containing
1694 point @var{count} lines down from the top of the window.  If
1695 @var{count} is a negative number, then it counts upward from the
1696 bottom of the window, so that @minus{}1 stands for the last usable
1697 line in the window.  If @var{count} is a non-@code{nil} list, then it
1698 stands for the line in the middle of the window.
1700 If @var{count} is @code{nil}, @code{recenter} puts the line containing
1701 point in the middle of the window, then clears and redisplays the entire
1702 selected frame.
1704 When @code{recenter} is called interactively, @var{count} is the raw
1705 prefix argument.  Thus, typing @kbd{C-u} as the prefix sets the
1706 @var{count} to a non-@code{nil} list, while typing @kbd{C-u 4} sets
1707 @var{count} to 4, which positions the current line four lines from the
1708 top.
1710 With an argument of zero, @code{recenter} positions the current line at
1711 the top of the window.  This action is so handy that some people make a
1712 separate key binding to do this.  For example,
1714 @example
1715 @group
1716 (defun line-to-top-of-window ()
1717   "Scroll current line to top of window.
1718 Replaces three keystroke sequence C-u 0 C-l."
1719   (interactive)
1720   (recenter 0))
1722 (global-set-key [kp-multiply] 'line-to-top-of-window)
1723 @end group
1724 @end example
1725 @end deffn
1727 @node Vertical Scrolling
1728 @section Vertical Fractional Scrolling
1729 @cindex vertical fractional scrolling
1730 @cindex vertical scroll position
1732    @dfn{Vertical fractional scrolling} means shifting text in a window
1733 up or down by a specified multiple or fraction of a line.  Each window
1734 has a @dfn{vertical scroll position}, which is a number, never less than
1735 zero.  It specifies how far to raise the contents of the window.
1736 Raising the window contents generally makes all or part of some lines
1737 disappear off the top, and all or part of some other lines appear at the
1738 bottom.  The usual value is zero.
1740    The vertical scroll position is measured in units of the normal line
1741 height, which is the height of the default font.  Thus, if the value is
1742 .5, that means the window contents are scrolled up half the normal line
1743 height.  If it is 3.3, that means the window contents are scrolled up
1744 somewhat over three times the normal line height.
1746    What fraction of a line the vertical scrolling covers, or how many
1747 lines, depends on what the lines contain.  A value of .5 could scroll a
1748 line whose height is very short off the screen, while a value of 3.3
1749 could scroll just part of the way through a tall line or an image.
1751 @defun window-vscroll &optional window pixels-p
1752 This function returns the current vertical scroll position of
1753 @var{window}.  The default for @var{window} is the selected window.
1754 If @var{pixels-p} is non-@code{nil}, the return value is measured in
1755 pixels, rather than in units of the normal line height.
1757 @example
1758 @group
1759 (window-vscroll)
1760      @result{} 0
1761 @end group
1762 @end example
1763 @end defun
1765 @defun set-window-vscroll window lines &optional pixels-p
1766 This function sets @var{window}'s vertical scroll position to
1767 @var{lines}.  If @var{window} is @code{nil}, the selected window is
1768 used.  The argument @var{lines} should be zero or positive; if not, it
1769 is taken as zero.
1772 The actual vertical scroll position must always correspond
1773 to an integral number of pixels, so the value you specify
1774 is rounded accordingly.
1776 The return value is the result of this rounding.
1778 @example
1779 @group
1780 (set-window-vscroll (selected-window) 1.2)
1781      @result{} 1.13
1782 @end group
1783 @end example
1785 If @var{pixels-p} is non-@code{nil}, @var{lines} specifies a number of
1786 pixels.  In this case, the return value is @var{lines}.
1787 @end defun
1789 @defvar auto-window-vscroll
1790 If this variable is non-@code{nil}, the line-move, scroll-up, and
1791 scroll-down functions will automatically modify the vertical scroll
1792 position to scroll through display rows that are taller than the height
1793 of the window, for example in the presence of large images.
1794 @end defvar
1796 @node Horizontal Scrolling
1797 @section Horizontal Scrolling
1798 @cindex horizontal scrolling
1800   @dfn{Horizontal scrolling} means shifting the image in the window left
1801 or right by a specified multiple of the normal character width.  Each
1802 window has a @dfn{horizontal scroll position}, which is a number, never
1803 less than zero.  It specifies how far to shift the contents left.
1804 Shifting the window contents left generally makes all or part of some
1805 characters disappear off the left, and all or part of some other
1806 characters appear at the right.  The usual value is zero.
1808   The horizontal scroll position is measured in units of the normal
1809 character width, which is the width of space in the default font.  Thus,
1810 if the value is 5, that means the window contents are scrolled left by 5
1811 times the normal character width.  How many characters actually
1812 disappear off to the left depends on their width, and could vary from
1813 line to line.
1815   Because we read from side to side in the ``inner loop,'' and from top
1816 to bottom in the ``outer loop,'' the effect of horizontal scrolling is
1817 not like that of textual or vertical scrolling.  Textual scrolling
1818 involves selection of a portion of text to display, and vertical
1819 scrolling moves the window contents contiguously; but horizontal
1820 scrolling causes part of @emph{each line} to go off screen.
1822   Usually, no horizontal scrolling is in effect; then the leftmost
1823 column is at the left edge of the window.  In this state, scrolling to
1824 the right is meaningless, since there is no data to the left of the edge
1825 to be revealed by it; so this is not allowed.  Scrolling to the left is
1826 allowed; it scrolls the first columns of text off the edge of the window
1827 and can reveal additional columns on the right that were truncated
1828 before.  Once a window has a nonzero amount of leftward horizontal
1829 scrolling, you can scroll it back to the right, but only so far as to
1830 reduce the net horizontal scroll to zero.  There is no limit to how far
1831 left you can scroll, but eventually all the text will disappear off the
1832 left edge.
1834 @vindex auto-hscroll-mode
1835   If @code{auto-hscroll-mode} is set, redisplay automatically alters
1836 the horizontal scrolling of a window as necessary to ensure that point
1837 is always visible.  However, you can still set the horizontal
1838 scrolling value explicitly.  The value you specify serves as a lower
1839 bound for automatic scrolling, i.e. automatic scrolling will not
1840 scroll a window to a column less than the specified one.
1842 @deffn Command scroll-left &optional count set-minimum
1843 This function scrolls the selected window @var{count} columns to the
1844 left (or to the right if @var{count} is negative).  The default
1845 for @var{count} is the window width, minus 2.
1847 The return value is the total amount of leftward horizontal scrolling in
1848 effect after the change---just like the value returned by
1849 @code{window-hscroll} (below).
1851 Once you scroll a window as far right as it can go, back to its normal
1852 position where the total leftward scrolling is zero, attempts to scroll
1853 any farther right have no effect.
1855 If @var{set-minimum} is non-@code{nil}, the new scroll amount becomes
1856 the lower bound for automatic scrolling; that is, automatic scrolling
1857 will not scroll a window to a column less than the value returned by
1858 this function.  Interactive calls pass non-@code{nil} for
1859 @var{set-minimum}.
1860 @end deffn
1862 @deffn Command scroll-right &optional count set-minimum
1863 This function scrolls the selected window @var{count} columns to the
1864 right (or to the left if @var{count} is negative).  The default
1865 for @var{count} is the window width, minus 2.  Aside from the direction
1866 of scrolling, this works just like @code{scroll-left}.
1867 @end deffn
1869 @defun window-hscroll &optional window
1870 This function returns the total leftward horizontal scrolling of
1871 @var{window}---the number of columns by which the text in @var{window}
1872 is scrolled left past the left margin.  The default for
1873 @var{window} is the selected window.
1875 The return value is never negative.  It is zero when no horizontal
1876 scrolling has been done in @var{window} (which is usually the case).
1879 @example
1880 @group
1881 (window-hscroll)
1882      @result{} 0
1883 @end group
1884 @group
1885 (scroll-left 5)
1886      @result{} 5
1887 @end group
1888 @group
1889 (window-hscroll)
1890      @result{} 5
1891 @end group
1892 @end example
1893 @end defun
1895 @defun set-window-hscroll window columns
1896 This function sets horizontal scrolling of @var{window}.  The value of
1897 @var{columns} specifies the amount of scrolling, in terms of columns
1898 from the left margin.  The argument @var{columns} should be zero or
1899 positive; if not, it is taken as zero.  Fractional values of
1900 @var{columns} are not supported at present.
1902 Note that @code{set-window-hscroll} may appear not to work if you test
1903 it by evaluating a call with @kbd{M-:} in a simple way.  What happens
1904 is that the function sets the horizontal scroll value and returns, but
1905 then redisplay adjusts the horizontal scrolling to make point visible,
1906 and this overrides what the function did.  You can observe the
1907 function's effect if you call it while point is sufficiently far from
1908 the left margin that it will remain visible.
1910 The value returned is @var{columns}.
1912 @example
1913 @group
1914 (set-window-hscroll (selected-window) 10)
1915      @result{} 10
1916 @end group
1917 @end example
1918 @end defun
1920    Here is how you can determine whether a given position @var{position}
1921 is off the screen due to horizontal scrolling:
1923 @example
1924 @group
1925 (defun hscroll-on-screen (window position)
1926   (save-excursion
1927     (goto-char position)
1928     (and
1929      (>= (- (current-column) (window-hscroll window)) 0)
1930      (< (- (current-column) (window-hscroll window))
1931         (window-width window)))))
1932 @end group
1933 @end example
1935 @node Size of Window
1936 @section The Size of a Window
1937 @cindex window size
1938 @cindex size of window
1940   An Emacs window is rectangular, and its size information consists of
1941 the height (the number of lines) and the width (the number of character
1942 positions in each line).  The mode line is included in the height.  But
1943 the width does not count the scroll bar or the column of @samp{|}
1944 characters that separates side-by-side windows.
1946   The following three functions return size information about a window:
1948 @defun window-height &optional window
1949 This function returns the number of lines in @var{window} (by default
1950 the selected window), including any mode line and header line.
1951 The result is almost always less than the value of @code{frame-height}
1952 for the associated frame, because the latter also includes any echo
1953 area.  Depending on the toolkit in use, the frame height can also
1954 include the menu bar and tool bar (@pxref{Size and Position}).
1955 Therefore in general it is not straightforward to compare window and
1956 frame heights (see @code{window-full-height-p} below).
1958 @example
1959 @group
1960 (window-height)
1961      @result{} 23
1962 @end group
1963 @group
1964 (split-window-vertically)
1965      @result{} #<window 4 on windows.texi>
1966 @end group
1967 @group
1968 (window-height)
1969      @result{} 11
1970 @end group
1971 @end example
1972 @end defun
1974 @defun window-body-height &optional window
1975 Like @code{window-height} but the value does not include the
1976 mode line (if any) or the header line (if any).
1977 @end defun
1979 @defun window-full-height-p &optional window
1980 This function returns non-@code{nil} if @var{window} is as tall as the
1981 frame that contains it.  The default for @var{window} is the selected
1982 window.
1983 @end defun
1985 @defun window-width &optional window
1986 This function returns the number of columns in @var{window}.  The
1987 default for @var{window} is the selected window.
1989 The return value does not include the window's scroll bar or the column
1990 of @samp{|} characters that separates side-by-side windows.  Moreover,
1991 the return value does not include the space used for displaying fringes
1992 and margins.  Hence you cannot, in general, compare the return values of
1993 @code{window-width} and @code{frame-width} for equality to determine
1994 whether a window is a wide as the containing frame.  Use the function
1995 @code{window-full-width-p}, see below, instead.
1997 @example
1998 @group
1999 (window-width)
2000      @result{} 80
2001 @end group
2002 @end example
2003 @end defun
2005 @defun window-full-width-p &optional window
2006 This function returns non-@code{nil} if @var{window} is as wide as the
2007 frame that contains it; otherwise @code{nil}.  The default for
2008 @var{window} is the selected window.
2009 @end defun
2011 @defun window-edges &optional window
2012 This function returns a list of the edge coordinates of @var{window}.
2013 The default for @var{window} is the selected window.
2015 The order of the list is @code{(@var{left} @var{top} @var{right}
2016 @var{bottom})}, all elements relative to 0, 0 at the top left corner of
2017 the frame.  The element @var{right} of the value is one more than the
2018 rightmost column used by @var{window}, and @var{bottom} is one more than
2019 the bottommost row used by @var{window} and its mode-line.
2021 The edges include the space used by the window's scroll bar, display
2022 margins, fringes, header line, and mode line, if it has them.  Also,
2023 if the window has a neighbor on the right, its right edge value
2024 includes the width of the separator line between the window and that
2025 neighbor.  Since the width of the window does not include this
2026 separator, the width does not usually equal the difference between the
2027 right and left edges.
2028 @end defun
2030 @defun window-inside-edges &optional window
2031 This is similar to @code{window-edges}, but the edge values
2032 it returns include only the text area of the window.  They
2033 do not include the header line, mode line, scroll bar or
2034 vertical separator, fringes, or display margins.
2035 @end defun
2037 Here are the results obtained on a typical 24-line terminal with just
2038 one window, with menu bar enabled:
2040 @example
2041 @group
2042 (window-edges (selected-window))
2043      @result{} (0 1 80 23)
2044 @end group
2045 @group
2046 (window-inside-edges (selected-window))
2047      @result{} (0 1 80 22)
2048 @end group
2049 @end example
2051 @noindent
2052 The bottom edge is at line 23 because the last line is the echo area.
2053 The bottom inside edge is at line 22, which is the window's mode line.
2055 If @var{window} is at the upper left corner of its frame, and there is
2056 no menu bar, then @var{bottom} returned by @code{window-edges} is the
2057 same as the value of @code{(window-height)}, @var{right} is almost the
2058 same as the value of @code{(window-width)}, and @var{top} and
2059 @var{left} are zero.  For example, the edges of the following window
2060 are @w{@samp{0 0 8 5}}.  Assuming that the frame has more than 8
2061 columns, the last column of the window (column 7) holds a border
2062 rather than text.  The last row (row 4) holds the mode line, shown
2063 here with @samp{xxxxxxxxx}.
2065 @example
2066 @group
2067            0
2068            _______
2069         0 |       |
2070           |       |
2071           |       |
2072           |       |
2073           xxxxxxxxx  4
2075                   7
2076 @end group
2077 @end example
2079 In the following example, let's suppose that the frame is 7
2080 columns wide.  Then the edges of the left window are @w{@samp{0 0 4 3}}
2081 and the edges of the right window are @w{@samp{4 0 7 3}}.
2082 The inside edges of the left window are @w{@samp{0 0 3 2}},
2083 and the inside edges of the right window are @w{@samp{4 0 7 2}},
2085 @example
2086 @group
2087            ___ ___
2088           |   |   |
2089           |   |   |
2090           xxxxxxxxx
2092            0  34  7
2093 @end group
2094 @end example
2096 @defun window-pixel-edges &optional window
2097 This function is like @code{window-edges} except that, on a graphical
2098 display, the edge values are measured in pixels instead of in
2099 character lines and columns.
2100 @end defun
2102 @defun window-inside-pixel-edges &optional window
2103 This function is like @code{window-inside-edges} except that, on a
2104 graphical display, the edge values are measured in pixels instead of
2105 in character lines and columns.
2106 @end defun
2108 @node Resizing Windows
2109 @section Changing the Size of a Window
2110 @cindex window resizing
2111 @cindex resize window
2112 @cindex changing window size
2113 @cindex window size, changing
2115    The window size functions fall into two classes: high-level commands
2116 that change the size of windows and low-level functions that access
2117 window size.  Emacs does not permit overlapping windows or gaps between
2118 windows, so resizing a window always affects at least one other window.
2120 @deffn Command enlarge-window size &optional horizontal
2121 This function makes the selected window @var{size} lines taller by
2122 stealing lines from windows above or below.  In a first round, it takes
2123 lines from one window at a time until that window is
2124 @code{window-min-height} lines tall, then takes from another.  If, at
2125 the end of the first round, the selected window is still not tall
2126 enough, @code{enlarge-window} starts a second round, where it deletes
2127 windows above or below the selected one.
2129 If @var{horizontal} is non-@code{nil}, this function makes the window
2130 @var{size} columns wider, stealing columns instead of lines.  If a
2131 window from which columns are stolen shrinks below
2132 @code{window-min-width} columns, that window disappears.
2134 If the requested size would exceed that of the window's frame, then the
2135 function makes the window occupy the entire height (or width) of the
2136 frame.
2138 If there are various other windows from which lines or columns can be
2139 stolen, and some of them specify fixed size (using
2140 @code{window-size-fixed}, see below), they are left untouched while
2141 other windows are ``robbed.''  If it would be necessary to alter the
2142 size of a fixed-size window, @code{enlarge-window} gets an error
2143 instead.
2145 If @var{size} is negative, this function shrinks the selected window by
2146 @minus{}@var{size} lines or columns.  If that makes the window smaller
2147 than the minimum size (@code{window-min-height} and
2148 @code{window-min-width}), then @code{enlarge-window} deletes the window.
2150 @code{enlarge-window} returns @code{nil}.
2151 @end deffn
2153 @deffn Command enlarge-window-horizontally columns
2154 This function makes the selected window @var{columns} wider.
2155 It could be defined as follows:
2157 @example
2158 @group
2159 (defun enlarge-window-horizontally (columns)
2160   (interactive "p")
2161   (enlarge-window columns t))
2162 @end group
2163 @end example
2164 @end deffn
2166 @deffn Command shrink-window size &optional horizontal
2167 This function is like @code{enlarge-window} but negates the argument
2168 @var{size}, making the selected window smaller by giving lines (or
2169 columns) to the other windows.  If the window shrinks below
2170 @code{window-min-height} or @code{window-min-width}, then it disappears.
2172 If @var{size} is negative, the window is enlarged by @minus{}@var{size}
2173 lines or columns.
2174 @end deffn
2176 @deffn Command shrink-window-horizontally columns
2177 This function makes the selected window @var{columns} narrower.
2178 It could be defined as follows:
2180 @example
2181 @group
2182 (defun shrink-window-horizontally (columns)
2183   (interactive "p")
2184   (shrink-window columns t))
2185 @end group
2186 @end example
2187 @end deffn
2189 @defun adjust-window-trailing-edge window delta horizontal
2190 This function makes the selected window @var{delta} lines taller or
2191 @var{delta} columns wider, by moving the bottom or right edge.  This
2192 function does not delete other windows; if it cannot make the
2193 requested size adjustment, it signals an error.  On success, this
2194 function returns @code{nil}.
2195 @end defun
2197 @deffn Command fit-window-to-buffer &optional window max-height min-height
2198 This command makes @var{window} the right height to display its
2199 contents exactly.  The default for @var{window} is the selected window.
2201 The optional argument @var{max-height} specifies the maximum height the
2202 window is allowed to be; @code{nil} means use the maximum permissible
2203 height of a window on @var{window}'s frame.  The optional argument
2204 @var{min-height} specifies the minimum height for the window; @code{nil}
2205 means use @code{window-min-height}.  All these height values include the
2206 mode line and/or header line.
2208 This function can delete windows when their height shrinks below
2209 @var{min-height}.  It returns non-@code{nil} if it orderly resized
2210 @var{window}, and @code{nil} otherwise.
2211 @end deffn
2213 @deffn Command shrink-window-if-larger-than-buffer &optional window
2214 This command shrinks @var{window} vertically to be as small as possible
2215 while still showing the full contents of its buffer---but not less than
2216 @code{window-min-height} lines.  The default for @var{window} is
2217 the selected window.
2219 However, this command does nothing if the window is already too small to
2220 display the whole text of the buffer, or if part of the contents are
2221 currently scrolled off screen, or if the window is not the full width of
2222 its frame, or if the window is the only window in its frame.
2224 This command returns non-@code{nil} if it actually shrank the window
2225 and @code{nil} otherwise.
2226 @end deffn
2228 @cindex fixed-size window
2229 @defvar window-size-fixed
2230 If this variable is non-@code{nil}, in a given buffer, then the size of
2231 any window displaying that buffer remains fixed unless you either
2232 explicitly change it or Emacs has no other choice.
2234 If the value is @code{height}, then only the window's height is fixed;
2235 if the value is @code{width}, then only the window's width is fixed.
2236 Any other non-@code{nil} value fixes both the width and the height.
2238 This variable automatically becomes buffer-local when set.
2240 Explicit size-change functions such as @code{enlarge-window}
2241 get an error if they would have to change a window size which is fixed.
2242 Therefore, when you want to change the size of such a window,
2243 you should bind @code{window-size-fixed} to @code{nil}, like this:
2245 @example
2246 (let ((window-size-fixed nil))
2247    (enlarge-window 10))
2248 @end example
2250 Deleting an adjacent window or changing the frame size may change the
2251 size of a fixed-size window, if there is no other alternative.
2252 @end defvar
2254 @cindex minimum window size
2255   The following two variables constrain the window-structure-changing
2256 functions to a minimum height and width.
2258 @defopt window-min-height
2259 The value of this variable specifies how short a window may become
2260 before it is automatically deleted.  Making a window smaller than
2261 @code{window-min-height} automatically deletes it, and no window may be
2262 created shorter than this.  The value is measured in line units.  When
2263 the window wants a mode line and/or a header line, they are counted as
2264 one line each.  The default value is @code{4}.  A value less than
2265 @code{1} is ignored.
2266 @end defopt
2268 @defopt window-min-width
2269 The value of this variable specifies how narrow a window may become
2270 before it is automatically deleted.  Making a window smaller than
2271 @code{window-min-width} automatically deletes it, and no window may be
2272 created narrower than this.  The value is measured in characters and
2273 includes any fringes or the scroll bar.  The default value is @code{10}.
2274 A value less than @code{2} is ignored.
2275 @end defopt
2277 @cindex balancing window sizes
2278 Emacs provides two functions to balance windows, that is, to even out
2279 the sizes of windows on the same frame.  The minibuffer window and
2280 fixed-size windows are not resized by these functions.
2282 @deffn Command balance-windows &optional window-or-frame
2283 This function balances windows in a way that gives more space to
2284 full-width and/or full-height windows.  If @var{window-or-frame}
2285 specifies a frame, it balances all windows on that frame.  If
2286 @var{window-or-frame} specifies a window, it balances this window and
2287 its ``siblings'' only.  Think of a sibling as the other (original or
2288 new) window with respect to the present one, involved in the process of
2289 splitting; see @ref{Splitting Windows}.  Since a sibling may have been
2290 split again, a window can have more than one sibling.
2291 @end deffn
2293 @deffn Command balance-windows-area
2294 This function attempts to give all windows on the selected frame
2295 approximately the same share of the screen area.  This means that
2296 full-width or full-height windows are not given more space than other
2297 windows.
2298 @end deffn
2300 @node Coordinates and Windows
2301 @section Coordinates and Windows
2303 This section describes how to relate screen coordinates to windows.
2305 @defun window-at x y &optional frame
2306 This function returns the window containing the specified cursor
2307 position in the frame @var{frame}.  The coordinates @var{x} and @var{y}
2308 are measured in characters and count from the top left corner of the
2309 frame.  If they are out of range, @code{window-at} returns @code{nil}.
2311 If you omit @var{frame}, the selected frame is used.
2312 @end defun
2314 @defun coordinates-in-window-p coordinates window
2315 This function checks whether a particular frame position falls within
2316 the window @var{window}.
2318 The argument @var{coordinates} is a cons cell of the form @code{(@var{x}
2319 . @var{y})}.  The coordinates @var{x} and @var{y} are measured in
2320 characters, and count from the top left corner of the screen or frame.
2322 The value returned by @code{coordinates-in-window-p} is non-@code{nil}
2323 if the coordinates are inside @var{window}.  The value also indicates
2324 what part of the window the position is in, as follows:
2326 @table @code
2327 @item (@var{relx} . @var{rely})
2328 The coordinates are inside @var{window}.  The numbers @var{relx} and
2329 @var{rely} are the equivalent window-relative coordinates for the
2330 specified position, counting from 0 at the top left corner of the
2331 window.
2333 @item mode-line
2334 The coordinates are in the mode line of @var{window}.
2336 @item header-line
2337 The coordinates are in the header line of @var{window}.
2339 @item vertical-line
2340 The coordinates are in the vertical line between @var{window} and its
2341 neighbor to the right.  This value occurs only if the window doesn't
2342 have a scroll bar; positions in a scroll bar are considered outside the
2343 window for these purposes.
2345 @item left-fringe
2346 @itemx right-fringe
2347 The coordinates are in the left or right fringe of the window.
2349 @item left-margin
2350 @itemx right-margin
2351 The coordinates are in the left or right margin of the window.
2353 @item nil
2354 The coordinates are not in any part of @var{window}.
2355 @end table
2357 The function @code{coordinates-in-window-p} does not require a frame as
2358 argument because it always uses the frame that @var{window} is on.
2359 @end defun
2361 @node Window Tree
2362 @section The Window Tree
2363 @cindex window tree
2365   A @dfn{window tree} specifies the layout, size, and relationship
2366 between all windows in one frame.
2368 @defun window-tree &optional frame
2369 This function returns the window tree for frame @var{frame}.
2370 If @var{frame} is omitted, the selected frame is used.
2372 The return value is a list of the form @code{(@var{root} @var{mini})},
2373 where @var{root} represents the window tree of the frame's
2374 root window, and @var{mini} is the frame's minibuffer window.
2376 If the root window is not split, @var{root} is the root window itself.
2377 Otherwise, @var{root} is a list @code{(@var{dir} @var{edges} @var{w1}
2378 @var{w2} ...)} where @var{dir} is @code{nil} for a horizontal split,
2379 and @code{t} for a vertical split, @var{edges} gives the combined size and
2380 position of the subwindows in the split, and the rest of the elements
2381 are the subwindows in the split.  Each of the subwindows may again be
2382 a window or a list representing a window split, and so on.  The
2383 @var{edges} element is a list @code{(@var{left}@var{ top}@var{ right}@var{ bottom})}
2384 similar to the value returned by @code{window-edges}.
2385 @end defun
2387 @node Window Configurations
2388 @section Window Configurations
2389 @cindex window configurations
2390 @cindex saving window information
2392   A @dfn{window configuration} records the entire layout of one
2393 frame---all windows, their sizes, which buffers they contain, how those
2394 buffers are scrolled, and their values of point and the mark; also their
2395 fringes, margins, and scroll bar settings.  It also includes the value
2396 of @code{minibuffer-scroll-window}.  As a special exception, the window
2397 configuration does not record the value of point in the selected window
2398 for the current buffer.  Also, the window configuration does not record
2399 the values of window parameters; see @ref{Window Parameters}.
2401   You can bring back an entire frame layout by restoring a previously
2402 saved window configuration.  If you want to record the layout of all
2403 frames instead of just one, use a frame configuration instead of a
2404 window configuration; see @ref{Frame Configurations}.
2406 @defun current-window-configuration &optional frame
2407 This function returns a new object representing @var{frame}'s current
2408 window configuration.  The default for @var{frame} is the selected
2409 frame.
2410 @end defun
2412 @defun set-window-configuration configuration
2413 This function restores the configuration of windows and buffers as
2414 specified by @var{configuration}, for the frame that @var{configuration}
2415 was created for.
2417 The argument @var{configuration} must be a value that was previously
2418 returned by @code{current-window-configuration}.  The configuration is
2419 restored in the frame from which @var{configuration} was made, whether
2420 that frame is selected or not.  This always counts as a window size
2421 change and triggers execution of the @code{window-size-change-functions}
2422 (@pxref{Window Hooks}), because @code{set-window-configuration} doesn't
2423 know how to tell whether the new configuration actually differs from the
2424 old one.
2426 If the frame which @var{configuration} was saved from is dead, all this
2427 function does is restore the three variables @code{window-min-height},
2428 @code{window-min-width} and @code{minibuffer-scroll-window}. In this
2429 case, the function returns @code{nil}.  Otherwise, it returns @code{t}.
2431 Here is a way of using this function to get the same effect
2432 as @code{save-window-excursion}:
2434 @example
2435 @group
2436 (let ((config (current-window-configuration)))
2437   (unwind-protect
2438       (progn (split-window-vertically nil)
2439              @dots{})
2440     (set-window-configuration config)))
2441 @end group
2442 @end example
2443 @end defun
2445 @defspec save-window-excursion forms@dots{}
2446 This special form records the window configuration, executes @var{forms}
2447 in sequence, then restores the earlier window configuration.  The window
2448 configuration includes, for each window, the value of point and the
2449 portion of the buffer that is visible.  It also includes the choice of
2450 selected window.  However, it does not include the value of point in
2451 the current buffer; use @code{save-excursion} also, if you wish to
2452 preserve that.
2454 Don't use this construct when @code{save-selected-window} is sufficient.
2456 Exit from @code{save-window-excursion} always triggers execution of
2457 @code{window-size-change-functions}.  (It doesn't know how to tell
2458 whether the restored configuration actually differs from the one in
2459 effect at the end of the @var{forms}.)
2461 The return value is the value of the final form in @var{forms}.
2462 For example:
2464 @example
2465 @group
2466 (split-window)
2467      @result{} #<window 25 on control.texi>
2468 @end group
2469 @group
2470 (setq w (selected-window))
2471      @result{} #<window 19 on control.texi>
2472 @end group
2473 @group
2474 (save-window-excursion
2475   (delete-other-windows w)
2476   (switch-to-buffer "foo")
2477   'do-something)
2478      @result{} do-something
2479      ;; @r{The screen is now split again.}
2480 @end group
2481 @end example
2482 @end defspec
2484 @defun window-configuration-p object
2485 This function returns @code{t} if @var{object} is a window configuration.
2486 @end defun
2488 @defun compare-window-configurations config1 config2
2489 This function compares two window configurations as regards the
2490 structure of windows, but ignores the values of point and mark and the
2491 saved scrolling positions---it can return @code{t} even if those
2492 aspects differ.
2494 The function @code{equal} can also compare two window configurations; it
2495 regards configurations as unequal if they differ in any respect, even a
2496 saved point or mark.
2497 @end defun
2499 @defun window-configuration-frame config
2500 This function returns the frame for which the window configuration
2501 @var{config} was made.
2502 @end defun
2504   Other primitives to look inside of window configurations would make
2505 sense, but are not implemented because we did not need them.  See the
2506 file @file{winner.el} for some more operations on windows
2507 configurations.
2509 @node Window Parameters
2510 @section Window Parameters
2511 @cindex window parameters
2513 This sections describes how window parameters can be used to associate
2514 additional information with windows.
2516 @defun window-parameter window parameter
2517 This function returns @var{window}'s value for @var{parameter}.  The
2518 default for @var{window} is the selected window.  If @var{window}
2519 has no setting for @var{parameter}, this function returns @code{nil}.
2520 @end defun
2522 @defun window-parameters &optional window
2523 This function returns all parameters of @var{window} and their values.
2524 The default for @var{window} is the selected window.  The return value
2525 is an association list of elements of the form @code{(@var{parameter}
2526 . @var{value})}.
2527 @end defun
2529 @defun set-window-parameter window parameter value
2530 This function sets @var{window}'s value of @var{parameter} to
2531 @var{value} and returns @var{value}.  The default for @var{window}
2532 is the selected window.
2533 @end defun
2535 Currently, window parameters are not saved in window configurations and
2536 consequently not restored by @code{set-window-configuration}.  Hence,
2537 any change of a parameter introduced via @code{set-window-parameter} can
2538 be undone only by invoking @code{set-window-parameter} for the same
2539 parameter again.  Since @code{save-window-excursion} relies on window
2540 configurations (@pxref{Window Configurations}), window parameters are
2541 not saved and restored by that special form, either.
2543 @node Window Hooks
2544 @section Hooks for Window Scrolling and Changes
2545 @cindex hooks for window operations
2547 This section describes how a Lisp program can take action whenever a
2548 window displays a different part of its buffer or a different buffer.
2549 There are three actions that can change this: scrolling the window,
2550 switching buffers in the window, and changing the size of the window.
2551 The first two actions run @code{window-scroll-functions}; the last runs
2552 @code{window-size-change-functions}.
2554 @defvar window-scroll-functions
2555 This variable holds a list of functions that Emacs should call before
2556 redisplaying a window with scrolling.  Displaying a different buffer in
2557 the window also runs these functions.
2559 This variable is not a normal hook, because each function is called with
2560 two arguments: the window, and its new display-start position.
2562 These functions must be careful in using @code{window-end}
2563 (@pxref{Window Start and End}); if you need an up-to-date value, you
2564 must use the @var{update} argument to ensure you get it.
2566 @strong{Warning:} don't use this feature to alter the way the window
2567 is scrolled.  It's not designed for that, and such use probably won't
2568 work.
2569 @end defvar
2571 @defvar window-size-change-functions
2572 This variable holds a list of functions to be called if the size of any
2573 window changes for any reason.  The functions are called just once per
2574 redisplay, and just once for each frame on which size changes have
2575 occurred.
2577 Each function receives the frame as its sole argument.  There is no
2578 direct way to find out which windows on that frame have changed size, or
2579 precisely how.  However, if a size-change function records, at each
2580 call, the existing windows and their sizes, it can also compare the
2581 present sizes and the previous sizes.
2583 Creating or deleting windows counts as a size change, and therefore
2584 causes these functions to be called.  Changing the frame size also
2585 counts, because it changes the sizes of the existing windows.
2587 It is not a good idea to use @code{save-window-excursion} (@pxref{Window
2588 Configurations}) in these functions, because that always counts as a
2589 size change, and it would cause these functions to be called over and
2590 over.  In most cases, @code{save-selected-window} (@pxref{Selecting
2591 Windows}) is what you need here.
2592 @end defvar
2594 @defvar window-configuration-change-hook
2595 A normal hook that is run every time you change the window configuration
2596 of an existing frame.  This includes splitting or deleting windows,
2597 changing the sizes of windows, or displaying a different buffer in a
2598 window.
2600 The buffer-local part of this hook is run once per each window on the
2601 affected frame, with the relevant window selected and its buffer
2602 current.  The global part is run once for the modified frame, with that
2603 frame selected.
2604 @end defvar
2606   In addition, you can use @code{jit-lock-register} to register a Font
2607 Lock fontification function, which will be called whenever parts of a
2608 buffer are (re)fontified because a window was scrolled or its size
2609 changed.  @xref{Other Font Lock Variables}.
2611 @ignore
2612    arch-tag: 3f6c36e8-df49-4986-b757-417feed88be3
2613 @end ignore