(Special Properties): More accurate description of what the `cursor'
[bpt/emacs.git] / doc / lispref / windows.texi
CommitLineData
b8d4c8d0
GM
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,
0c5413c8
GM
4@c 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
5@c Free Software Foundation, Inc.
b8d4c8d0 6@c See the file elisp.texi for copying conditions.
6336d8c3 7@setfilename ../../info/windows
b8d4c8d0
GM
8@node Windows, Frames, Buffers, Top
9@chapter Windows
10
11 This chapter describes most of the functions and variables related to
0273ca3a
MR
12Emacs windows. @xref{Frames and Windows}, for how windows relate to
13frames. @xref{Display}, for information on how text is displayed in
14windows.
b8d4c8d0
GM
15
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.
0273ca3a 26* Dedicated Windows:: How to avoid displaying another buffer in
a1401ab1 27 a specific window.
b8d4c8d0 28* Window Point:: Each window has its own location of point.
0273ca3a
MR
29* Window Start and End:: Buffer positions indicating which text is
30 on-screen in a window.
b8d4c8d0
GM
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.
0273ca3a 39* Window Parameters:: Associating additional information with windows.
b8d4c8d0
GM
40* Window Hooks:: Hooks for scrolling, window size changes,
41 redisplay going past a certain point,
42 or window configuration changes.
43@end menu
44
45@node Basic Windows
46@section Basic Concepts of Emacs Windows
47@cindex window
48@cindex selected window
49
50 A @dfn{window} in Emacs is the physical area of the screen in which a
51buffer is displayed. The term is also used to refer to a Lisp object that
52represents that screen area in Emacs Lisp. It should be
53clear from the context which is meant.
54
47264a97 55 Emacs groups windows into frames; see @ref{Frames}. A frame
a1401ab1
EZ
56represents an area of screen available for Emacs to use. Each frame
57always contains at least one window, but you can subdivide it
58vertically or horizontally into multiple, nonoverlapping Emacs
59windows.
b8d4c8d0
GM
60
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
63window, but the other windows have ``non-selected'' cursors, normally
a1401ab1 64less visible. (@xref{Cursor Parameters}, for customizing this.) At
0273ca3a 65any time, one frame is the selected frame; and the window selected
7ed54cc5 66within that frame is @dfn{the selected window}. The selected window's
0273ca3a 67buffer is usually the current buffer (except when @code{set-buffer} has
47264a97 68been used); see @ref{Current Buffer}.
b8d4c8d0
GM
69
70 For practical purposes, a window exists only while it is displayed in
71a frame. Once removed from the frame, the window is effectively deleted
72and should not be used, @emph{even though there may still be references
47264a97 73to it} from other Lisp objects; see @ref{Deleting Windows}. Restoring a
0273ca3a 74saved window configuration is the only way for a window no longer on the
47264a97 75screen to come back to life; see @ref{Window Configurations}.
b8d4c8d0
GM
76
77@cindex multiple windows
78 Users create multiple windows so they can look at several buffers at
79once. Lisp libraries use multiple windows for a variety of reasons, but
80most often to display related information. In Rmail, for example, you
81can move through a summary buffer in one window while the other window
82shows messages one at a time as they are reached.
83
84 The meaning of ``window'' in Emacs is similar to what it means in the
85context of general-purpose window systems such as X, but not identical.
86The X Window System places X windows on the screen; Emacs uses one or
87more X windows as frames, and subdivides them into
88Emacs windows. When you use Emacs on a character-only terminal, Emacs
89treats the whole terminal screen as one frame.
90
91@cindex terminal screen
92@cindex screen of terminal
93@cindex tiled windows
94 Most window systems support arbitrarily located overlapping windows.
95In contrast, Emacs windows are @dfn{tiled}; they never overlap, and
96together they fill the whole screen or frame. Because of the way in
0273ca3a
MR
97which Emacs creates new windows (@pxref{Splitting Windows}) and resizes
98them (@pxref{Resizing Windows}), not all conceivable tilings of windows
99on an Emacs frame are actually possible.
b8d4c8d0
GM
100
101@defun windowp object
102This function returns @code{t} if @var{object} is a window.
103@end defun
104
105@node Splitting Windows
106@section Splitting Windows
107@cindex splitting windows
108@cindex window splitting
109
0273ca3a
MR
110The functions described below are the primitives used to split a window
111into two windows. They do not accept a buffer as an argument. Rather,
112the two ``halves'' of the split window initially display the same buffer
b8d4c8d0
GM
113previously visible in the window that was split.
114
115@deffn Command split-window &optional window size horizontal
0273ca3a 116This function splits a new window out of @var{window}'s screen area. It
aeeedf76
MR
117returns the new window. The default for @var{window} is the selected
118window. When you split the selected window, it remains selected.
0273ca3a
MR
119
120If @var{horizontal} is non-@code{nil}, then @var{window} splits into two
121side by side windows. The original window keeps the leftmost @var{size}
122columns, and gives the rest of the columns to the new window.
123Otherwise, @var{window} splits into windows one above the other, the
124original window keeps the upper @var{size} lines and gives the rest of
125the lines to the new window. The original window @var{window} is
126therefore the left-hand or upper of the two, and the new window is the
127right-hand or lower.
b8d4c8d0
GM
128
129If @var{size} is omitted or @code{nil}, then @var{window} is divided
130evenly into two parts. (If there is an odd line, it is allocated to
131the new window.) When @code{split-window} is called interactively,
132all its arguments are @code{nil}.
133
134If splitting would result in making a window that is smaller than
0273ca3a
MR
135@code{window-min-height} or @code{window-min-width} (@pxref{Resizing
136Windows}), @code{split-window} signals an error and does not split the
137window at all.
b8d4c8d0
GM
138
139The following example starts with one window on a screen that is 50
140lines high by 80 columns wide; then it splits the window.
141
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
149
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
165
166The screen looks like this:
167
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
181
182Next, split the top window horizontally:
183
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
202
203@need 3000
204Now the screen looks like this:
205
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
220
221Normally, Emacs indicates the border between two side-by-side windows
a1401ab1
EZ
222with a scroll bar (@pxref{Scroll Bars}), or with @samp{|} characters. The
223display table can specify alternative border characters; see @ref{Display
0273ca3a 224Tables}.
b8d4c8d0
GM
225@end deffn
226
227@deffn Command split-window-vertically &optional size
228This function splits the selected window into two windows, one above the
229other, leaving the upper of the two windows selected, with @var{size}
230lines. (If @var{size} is negative, then the lower of the two windows
96995b89 231gets @minus{}@var{size} lines and the upper window gets the rest, but
b8d4c8d0
GM
232the upper window is still the one selected.) However, if
233@code{split-window-keep-point} (see below) is @code{nil}, then either
234window can be selected.
235
236In other respects, this function is similar to @code{split-window}.
237In particular, the upper window is the original one and the return
238value is the new, lower window.
239@end deffn
240
241@defopt split-window-keep-point
242If this variable is non-@code{nil} (the default), then
243@code{split-window-vertically} behaves as described above.
244
245If it is @code{nil}, then @code{split-window-vertically} adjusts point
246in each of the two windows to avoid scrolling. (This is useful on
247slow terminals.) It selects whichever window contains the screen line
248that point was previously on.
249
96995b89
MR
250This variable affects the behavior of @code{split-window-vertically}
251only. It has no effect on the other functions described here.
b8d4c8d0
GM
252@end defopt
253
254@deffn Command split-window-horizontally &optional size
255This function splits the selected window into two windows
256side-by-side, leaving the selected window on the left with @var{size}
257columns. If @var{size} is negative, the rightmost window gets
96995b89 258@minus{}@var{size} columns, but the leftmost window still remains
b8d4c8d0
GM
259selected.
260
261This function is basically an interface to @code{split-window}.
262You could define a simplified version of the function like this:
263
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)
96995b89 273 (setq size (+ (window-width) size)))
b8d4c8d0
GM
274 (split-window nil size t)))
275@end group
276@end smallexample
277@end deffn
278
279@defun one-window-p &optional no-mini all-frames
280This function returns non-@code{nil} if there is only one window. The
281argument @var{no-mini}, if non-@code{nil}, means don't count the
282minibuffer even if it is active; otherwise, the minibuffer window is
283counted when it is active.
284
285The argument @var{all-frames} specifies which frames to consider. Here
286are the possible values and their meanings:
287
288@table @asis
289@item @code{nil}
290Count the windows in the selected frame, plus the minibuffer used
291by that frame even if it lies in some other frame.
292
293@item @code{t}
294Count all windows in all existing frames.
295
296@item @code{visible}
297Count all windows in all visible frames.
298
299@item 0
300Count all windows in all visible or iconified frames.
301
302@item anything else
303Count precisely the windows in the selected frame, and no others.
304@end table
305@end defun
306
307@node Deleting Windows
308@section Deleting Windows
309@cindex deleting windows
310
311A window remains visible on its frame unless you @dfn{delete} it by
312calling certain functions that delete windows. A deleted window cannot
313appear on the screen, but continues to exist as a Lisp object until
314there are no references to it. There is no way to cancel the deletion
315of a window aside from restoring a saved window configuration
316(@pxref{Window Configurations}). Restoring a window configuration also
317deletes any windows that aren't part of that configuration.
318
a1401ab1
EZ
319 When you delete a window, the space it took up is given to one of
320its sibling windows adjacent to it.
b8d4c8d0
GM
321
322@c Emacs 19 feature
323@defun window-live-p window
324This function returns @code{nil} if @var{window} is deleted, and
325@code{t} otherwise.
326
327@strong{Warning:} Erroneous information or fatal errors may result from
328using a deleted window as if it were live.
329@end defun
330
331@deffn Command delete-window &optional window
0273ca3a 332This function removes @var{window} from display and returns @code{nil}.
aeeedf76
MR
333The default for @var{window} is the selected window. An error is
334signaled if @var{window} is the only window on its frame.
b8d4c8d0
GM
335@end deffn
336
337@deffn Command delete-other-windows &optional window
338This function makes @var{window} the only window on its frame, by
aeeedf76
MR
339deleting the other windows in that frame. The default for @var{window}
340is the selected window. The return value is @code{nil}.
b8d4c8d0
GM
341@end deffn
342
520b29e7 343@deffn Command delete-windows-on &optional buffer-or-name frame
b8d4c8d0 344This function deletes all windows showing @var{buffer-or-name}. If
aeeedf76
MR
345there are no windows showing @var{buffer-or-name}, it does nothing. The
346optional argument @var{buffer-or-name} may be a buffer or the name of an
347existing buffer and defaults to the current buffer.
b8d4c8d0
GM
348
349@code{delete-windows-on} operates frame by frame. If a frame has
350several windows showing different buffers, then those showing
351@var{buffer-or-name} are removed, and the others expand to fill the
352space. 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
354winds up with a single window showing another buffer chosen with
0273ca3a
MR
355@code{other-buffer} (@pxref{The Buffer List}). If, however, the window
356showing @var{buffer-or-name} is dedicated to its buffer
357(@pxref{Dedicated Windows}), and there are other frames left, that
358window's frame is deleted.
b8d4c8d0 359
aeeedf76
MR
360The optional argument @var{frame} specifies which frames to operate on.
361This function does not use it in quite the same way as the other
362functions which scan all windows; specifically, the values @code{t} and
363@code{nil} have the opposite of their meanings in other functions. Here
364are the full details:
b8d4c8d0
GM
365
366@itemize @bullet
367@item
368If it is @code{nil}, operate on all frames.
369@item
370If it is @code{t}, operate on the selected frame.
371@item
372If it is @code{visible}, operate on all visible frames.
373@item
374If it is 0, operate on all visible or iconified frames.
375@item
376If it is a frame, operate on that frame.
377@end itemize
378
379This function always returns @code{nil}.
380@end deffn
381
382@node Selecting Windows
383@section Selecting Windows
384@cindex selecting a window
385
386 When a window is selected, the buffer in the window becomes the current
387buffer, and the cursor will appear in it.
388
389@defun selected-window
390This function returns the selected window. This is the window in
391which the cursor appears and to which many commands apply.
392@end defun
393
394@defun select-window window &optional norecord
395This function makes @var{window} the selected window. The cursor then
a1401ab1
EZ
396appears in @var{window} (after redisplay). Unless @var{window} was
397already selected, @code{select-window} makes @var{window}'s buffer the
398current buffer. The return value is @var{window}.
b8d4c8d0 399
0273ca3a
MR
400Normally, @var{window}'s selected buffer is moved to the front of the
401buffer list (@pxref{The Buffer List}) and @var{window} becomes the most
402recently selected window. But if @var{norecord} is non-@code{nil}, the
403buffer list remains unchanged and @var{window} does not become the most
404recently selected one.
b8d4c8d0 405
b8d4c8d0
GM
406
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
415
416@defmac save-selected-window forms@dots{}
417This macro records the selected frame, as well as the selected window
418of each frame, executes @var{forms} in sequence, then restores the
419earlier selected frame and windows. It also saves and restores the
420current buffer. It returns the value of the last form in @var{forms}.
421
422This macro does not save or restore anything about the sizes,
a1401ab1 423arrangement or contents of windows; therefore, if @var{forms} change
0273ca3a
MR
424them, the change persists. If the previously selected window of some
425frame is no longer live at the time of exit from @var{forms}, that
426frame's selected window is left alone. If the previously selected
427window 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
429only if it is still live when exiting @var{forms}.
430
431This macro changes neither the ordering of recently selected windows nor
432the buffer list.
b8d4c8d0
GM
433@end defmac
434
435@defmac with-selected-window window forms@dots{}
0273ca3a
MR
436This macro selects @var{window}, executes @var{forms} in sequence, then
437restores the previously selected window and current buffer. The ordering
438of recently selected windows and the buffer list remain unchanged unless
439you deliberately change them within @var{forms}, for example, by calling
b8766179 440@code{select-window} with argument @var{norecord} @code{nil}.
b8d4c8d0
GM
441@end defmac
442
443@cindex finding windows
444 The following functions choose one of the windows on the screen,
445offering various criteria for the choice.
446
447@defun get-lru-window &optional frame dedicated
448This function returns the window least recently ``used'' (that is,
b8766179
MR
449selected) among a set of candidate windows. If any full-width windows
450are present, it only considers these.
b8d4c8d0 451
b8766179
MR
452The selected window is returned if it is the only candidate. A
453minibuffer window is never a candidate. A dedicated window
454(@pxref{Dedicated Windows}) is never a candidate unless the optional
455argument @var{dedicated} is non-@code{nil}.
b8d4c8d0 456
aeeedf76
MR
457The optional argument @var{frame} specifies which windows are
458considered.
b8d4c8d0
GM
459
460@itemize @bullet
461@item
462If it is @code{nil}, consider windows on the selected frame.
463@item
464If it is @code{t}, consider windows on all frames.
465@item
466If it is @code{visible}, consider windows on all visible frames.
467@item
468If it is 0, consider windows on all visible or iconified frames.
469@item
470If it is a frame, consider windows on that frame.
471@end itemize
472@end defun
473
474@defun get-largest-window &optional frame dedicated
475This function returns the window with the largest area (height times
476width). If there are no side-by-side windows, then this is the window
0273ca3a
MR
477with the most lines. A minibuffer window is never a candidate. A
478dedicated window (@pxref{Dedicated Windows}) is never a candidate unless
aeeedf76 479the optional argument @var{dedicated} is non-@code{nil}.
b8d4c8d0
GM
480
481If there are two candidate windows of the same size, this function
a1401ab1 482prefers the one that comes first in the cyclic ordering of windows,
0273ca3a 483starting from the selected window (@pxref{Cyclic Window Ordering}).
b8d4c8d0 484
aeeedf76
MR
485The optional argument @var{frame} specifies which set of windows to
486consider, see @code{get-lru-window} above.
b8d4c8d0
GM
487@end defun
488
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
492This function returns a window satisfying @var{predicate}. It cycles
493through all visible windows using @code{walk-windows} (@pxref{Cyclic
0273ca3a
MR
494Window Ordering}), calling @var{predicate} on each one of them with that
495window as its argument. The function returns the first window for which
496@var{predicate} returns a non-@code{nil} value; if that never happens,
497it returns @var{default} (which defaults to @code{nil}).
b8d4c8d0
GM
498
499The optional arguments @var{minibuf} and @var{all-frames} specify the
500set 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
503
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
510
511 When you use the command @kbd{C-x o} (@code{other-window}) to select
0273ca3a
MR
512some other window, it moves through the windows on the screen in a
513specific order. For any given configuration of windows, this order
514never varies. It is called the @dfn{cyclic ordering of windows}.
b8d4c8d0 515
b8766179
MR
516 For a particular frame, this ordering generally goes from top to
517bottom, and from left to right. But it may go down first or go right
518first, depending on the order in which windows were split.
b8d4c8d0
GM
519
520 If the first split was vertical (into windows one above each other),
521and then the subwindows were split horizontally, then the ordering is
522left to right in the top of the frame, and then left to right in the
523next lower part of the frame, and so on. If the first split was
524horizontal, the ordering is top to bottom in the left part, and so on.
0273ca3a
MR
525In 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.
b8d4c8d0 527
04173931 528@deffn next-window &optional window minibuf all-frames
b8d4c8d0
GM
529@cindex minibuffer window, and @code{next-window}
530This function returns the window following @var{window} in the cyclic
0273ca3a 531ordering of windows. This is the window @kbd{C-x o} selects if typed
aeeedf76
MR
532when @var{window} is selected. The default for @var{window} is the
533selected window.
b8d4c8d0 534
aeeedf76
MR
535The value of the optional argument @var{minibuf} specifies whether the
536minibuffer is included in the window order. Normally, when
537@var{minibuf} is @code{nil}, the minibuffer is included only if it is
538currently ``active''; this matches the behavior of @kbd{C-x o}. (The
539minibuffer window is active while the minibuffer is in use; see
540@ref{Minibuffers}.)
b8d4c8d0 541
0273ca3a
MR
542If @var{minibuf} is @code{t}, the cyclic ordering includes the
543minibuffer 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
545it is active.
b8d4c8d0 546
aeeedf76
MR
547The optional argument @var{all-frames} specifies which frames to
548consider. Here are the possible values and their meanings:
b8d4c8d0
GM
549
550@table @asis
551@item @code{nil}
552Consider all the windows in @var{window}'s frame, plus the minibuffer
553used by that frame even if it lies in some other frame. If the
554minibuffer counts (as determined by @var{minibuf}), then all windows on
555all frames that share that minibuffer count too.
556
557@item @code{t}
558Consider all windows in all existing frames.
559
560@item @code{visible}
561Consider all windows in all visible frames. (To get useful results, you
562must ensure @var{window} is in a visible frame.)
563
564@item 0
565Consider all windows in all visible or iconified frames.
566
567@item a frame
568Consider all windows on that frame.
569
570@item anything else
571Consider precisely the windows in @var{window}'s frame, and no others.
572@end table
573
574This example assumes there are two windows, both displaying the
575buffer @samp{windows.texi}:
576
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
0273ca3a 591@end deffn
b8d4c8d0 592
04173931 593@deffn previous-window &optional window minibuf all-frames
b8d4c8d0
GM
594This function returns the window preceding @var{window} in the cyclic
595ordering of windows. The other arguments specify which windows to
596include in the cycle, as in @code{next-window}.
0273ca3a 597@end deffn
b8d4c8d0
GM
598
599@deffn Command other-window count &optional all-frames
0273ca3a
MR
600This function selects another window in the cyclic ordering of windows.
601@var{count} specifies the number of windows to skip in the ordering,
602starting 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.
605If @var{count} is zero, it does not skip any window, thus re-selecting
606the selected window. In an interactive call, @var{count} is the numeric
607prefix argument.
b8d4c8d0 608
aeeedf76 609The optional argument @var{all-frames} has the same meaning as in
b8d4c8d0 610@code{next-window}, but the @var{minibuf} argument of @code{next-window}
0273ca3a 611is always effectively @code{nil}. This function returns @code{nil}.
b8d4c8d0
GM
612@end deffn
613
614@c Emacs 19 feature
615@defun walk-windows proc &optional minibuf all-frames
616This function cycles through all windows. It calls the function
617@code{proc} once for each window, with the window as its sole
618argument.
619
620The optional arguments @var{minibuf} and @var{all-frames} specify the
0273ca3a 621set of windows to include in the walk. See @code{next-window}, above,
b8d4c8d0
GM
622for details.
623@end defun
624
625@defun window-list &optional frame minibuf window
0273ca3a 626This function returns a list of all windows on @var{frame}, starting
aeeedf76
MR
627with @var{window}. The default for @var{frame} is the selected frame;
628the default for @var{window} is the selected window.
b8d4c8d0 629
0273ca3a 630The value of @var{minibuf} specifies if the minibuffer window shall be
b8d4c8d0
GM
631included in the result list. If @var{minibuf} is @code{t}, the result
632always includes the minibuffer window. If @var{minibuf} is @code{nil}
633or omitted, that includes the minibuffer window if it is active. If
634@var{minibuf} is neither @code{nil} nor @code{t}, the result never
635includes the minibuffer window.
636@end defun
637
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
643
644 This section describes low-level functions to examine windows or to
645display buffers in windows in a precisely controlled fashion.
646@iftex
647See the following section for
648@end iftex
649@ifnottex
650@xref{Displaying Buffers}, for
651@end ifnottex
652related functions that find a window to use and specify a buffer for it.
0273ca3a
MR
653The functions described there are easier to use, but they employ
654heuristics in choosing or creating a window; use the functions described
655here when you need complete control.
b8d4c8d0
GM
656
657@defun set-window-buffer window buffer-or-name &optional keep-margins
658This function makes @var{window} display @var{buffer-or-name} as its
aeeedf76
MR
659contents. It returns @code{nil}. The default for @var{window} is the
660selected window. The argument @var{buffer-or-name} must specify a
661buffer or the name of an existing buffer.
662
663@code{set-window-buffer} is the fundamental primitive for changing which
664buffer is displayed in a window, and all ways of doing that call this
665function.
b8d4c8d0
GM
666
667@example
668@group
669(set-window-buffer (selected-window) "foo")
670 @result{} nil
671@end group
672@end example
673
0273ca3a
MR
674Normally, displaying @var{buffer-or-name} in @var{window} resets the
675window's position, display margins, fringe widths, and scroll bar
a1401ab1 676settings based on the local variables of that buffer.
0273ca3a
MR
677However, if @var{keep-margins} is non-@code{nil}, display margins and
678fringe widths of @var{window} remain unchanged. @xref{Fringes}.
679
aeeedf76
MR
680@code{set-window-buffer} signals an error when @var{window} is
681@dfn{strongly} dedicated to its buffer (@pxref{Dedicated Windows}) and
682does not already display @var{buffer-or-name}.
0273ca3a 683
aeeedf76
MR
684Note that this function runs @code{window-scroll-functions} before
685running @code{window-configuration-change-hook}.
b8d4c8d0
GM
686@end defun
687
688@defvar buffer-display-count
0273ca3a 689This buffer-local variable records the number of times a buffer has been
b8d4c8d0
GM
690displayed in a window. It is incremented each time
691@code{set-window-buffer} is called for the buffer.
692@end defvar
693
694@defun window-buffer &optional window
aeeedf76
MR
695This function returns the buffer that @var{window} is displaying. The
696default for @var{window} is the selected window.
b8d4c8d0
GM
697
698@example
699@group
700(window-buffer)
701 @result{} #<buffer windows.texi>
702@end group
703@end example
704@end defun
705
520b29e7 706@defun get-buffer-window &optional buffer-or-name all-frames
b8d4c8d0
GM
707This function returns a window currently displaying
708@var{buffer-or-name}, or @code{nil} if there is none. If there are
709several such windows, then the function returns the first one in the
710cyclic ordering of windows, starting from the selected window.
711@xref{Cyclic Window Ordering}.
712
aeeedf76
MR
713The argument @var{BUFFER-OR-NAME} may be a buffer or a buffer name and
714defaults to the current buffer. The optional argument @var{all-frames}
715specifies which windows to consider:
b8d4c8d0
GM
716
717@itemize @bullet
718@item
0273ca3a 719@code{nil} means consider windows on the selected frame.
b8d4c8d0 720@item
0273ca3a 721@code{t} means consider windows on all existing frames.
b8d4c8d0 722@item
0273ca3a 723@code{visible} means consider windows on all visible frames.
b8d4c8d0 724@item
0273ca3a 7250 means consider windows on all visible or iconified frames.
b8d4c8d0 726@item
0273ca3a 727A frame means consider windows on that frame only.
b8d4c8d0 728@end itemize
0273ca3a
MR
729
730Observe that the behavior of @code{get-buffer-window} may differ from
731that of @code{next-window} (@pxref{Cyclic Window Ordering}) when
732@var{all-frames} equals @code{nil} or any value not listed here.
733Perhaps we will change @code{get-buffer-window} in the future to make it
734compatible with the other functions.
b8d4c8d0
GM
735@end defun
736
520b29e7
MR
737@defun get-buffer-window-list &optional buffer-or-name minibuf all-frames
738This function returns a list of all windows currently displaying
aeeedf76
MR
739@var{buffer-or-name}. The argument @var{buffer-or-name} may be a buffer
740or the name of an existing buffer and defaults to the current buffer.
b8d4c8d0 741
0273ca3a
MR
742The 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}.
b8d4c8d0
GM
745@end defun
746
747@defvar buffer-display-time
748This variable records the time at which a buffer was last made visible
749in 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}).
752When a buffer is first created, @code{buffer-display-time} starts out
753with the value @code{nil}.
754@end defvar
755
756@node Displaying Buffers
757@section Displaying Buffers in Windows
758@cindex switching to a buffer
759@cindex displaying a buffer
760
761 In this section we describe convenient functions that choose a window
762automatically and use it to display a specified buffer. These functions
763can also split an existing window in certain circumstances. We also
764describe variables that parameterize the heuristics used for choosing a
765window.
766@iftex
767See the preceding section for
768@end iftex
769@ifnottex
770@xref{Buffers and Windows}, for
771@end ifnottex
43c59a3d 772low-level primitives that give you more precise control. All of these
b8d4c8d0
GM
773functions work by calling @code{set-window-buffer}.
774
775 Do not use the functions in this section in order to make a buffer
776current so that a Lisp program can access or modify it; they are too
777drastic for that purpose, since they change the display of buffers in
778windows, which would be gratuitous and surprise the user. Instead, use
779@code{set-buffer} and @code{save-current-buffer} (@pxref{Current
780Buffer}), which designate buffers as current for programmed access
781without affecting the display of buffers in windows.
782
783@deffn Command switch-to-buffer buffer-or-name &optional norecord
784This function makes @var{buffer-or-name} the current buffer, and also
785displays the buffer in the selected window. This means that a human can
786see the buffer and subsequent keyboard commands will apply to it.
787Contrast this with @code{set-buffer}, which makes @var{buffer-or-name}
aeeedf76 788the current buffer but does not display it in the selected window;
a1401ab1 789see @ref{Current Buffer}.
b8d4c8d0 790
0273ca3a
MR
791If @var{buffer-or-name} is @code{nil}, @code{switch-to-buffer} chooses a
792buffer using @code{other-buffer}. If @var{buffer-or-name} is a string
793that does not identify an existing buffer, then a new buffer by that
794name is created. The major mode for the new buffer is set according to
4e3b4528 795the variable @code{major-mode}; see @ref{Auto Major Mode}.
b8d4c8d0 796
b8766179
MR
797When the selected window is the minibuffer window or is strongly
798dedicated to its buffer (@pxref{Dedicated Windows}), this function calls
86ab855a
MR
799@code{pop-to-buffer} (see below) to display the buffer in some other
800window.
801
b8d4c8d0
GM
802Normally 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
804list). This affects the operation of @code{other-buffer}. However, if
805@var{norecord} is non-@code{nil}, this is not done. @xref{The Buffer
806List}.
807
808The @code{switch-to-buffer} function is often used interactively, as
809the binding of @kbd{C-x b}. It is also used frequently in programs. It
810returns the buffer that it switched to.
811@end deffn
812
813The next two functions are similar to @code{switch-to-buffer}, except
814for the described features.
815
816@deffn Command switch-to-buffer-other-window buffer-or-name &optional norecord
af1a5cd5 817This function makes the buffer specified by @var{buffer-or-name} current
b8766179
MR
818and displays it in a window not currently selected, using the function
819@code{pop-to-buffer} (see below).
b8d4c8d0
GM
820
821The currently selected window is absolutely never used to do the job.
b8766179
MR
822If the selected window already displays @var{buffer-or-name}, then it
823continues to do so, but another window is nonetheless found to display
824it in as well.
b8d4c8d0
GM
825
826This function updates the buffer list just like @code{switch-to-buffer}
827unless @var{norecord} is non-@code{nil}.
828@end deffn
829
04173931 830@deffn pop-to-buffer buffer-or-name &optional other-window norecord
0273ca3a 831This command makes @var{buffer-or-name} the current buffer and switches
52a94b85
MR
832to it in some window, preferably not the window previously selected.
833The ``popped-to'' window becomes the selected window. Its frame is
b8766179
MR
834given the X server's focus, if possible; see @ref{Input Focus}. The
835return value is the buffer that was switched to.
0273ca3a
MR
836
837If @var{buffer-or-name} is @code{nil}, that means to choose some other
838buffer, but you don't specify which. If @var{buffer-or-name} is a
839string that does not name an existing buffer, a buffer by that name is
840created. The major mode for the new buffer is set according to the
4e3b4528 841variable @code{major-mode}. @xref{Auto Major Mode}.
b8d4c8d0 842
b8766179
MR
843If 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
845window in any visible frame already displaying the buffer; if there is
846one, 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
848displays the buffer in it. Otherwise, @code{pop-to-buffer} operates
849entirely within the selected frame. (If the selected frame has just a
850minibuffer, @code{pop-to-buffer} operates within the most recently
851selected frame that was not just a minibuffer.)
b8d4c8d0 852
0273ca3a
MR
853If the variable @code{pop-up-windows} is non-@code{nil}, windows may be
854split to create a new window that is different from the original window.
a1401ab1 855For details, see @ref{Choosing Window}.
b8d4c8d0
GM
856
857If @var{other-window} is non-@code{nil}, @code{pop-to-buffer} finds or
858creates another window even if @var{buffer-or-name} is already visible
859in the selected window. Thus @var{buffer-or-name} could end up
860displayed in two windows. On the other hand, if @var{buffer-or-name} is
861already displayed in the selected window and @var{other-window} is
0273ca3a
MR
862@code{nil}, then the selected window is considered sufficient for
863displaying @var{buffer-or-name}, so that nothing needs to be done.
b8d4c8d0
GM
864
865All the variables that affect @code{display-buffer} affect
866@code{pop-to-buffer} as well. @xref{Choosing Window}.
867
b8d4c8d0
GM
868This function updates the buffer list just like @code{switch-to-buffer}
869unless @var{norecord} is non-@code{nil}.
0273ca3a 870@end deffn
b8d4c8d0 871
520b29e7 872@deffn Command replace-buffer-in-windows &optional buffer-or-name
da86d54b
EZ
873This function replaces @var{buffer-or-name} in all windows displaying
874it with some other buffer. It uses @code{other-buffer} to choose the
875other buffer. In the usual applications of this function, you
b8d4c8d0
GM
876don't care which other buffer is used; you just want to make sure that
877@var{buffer-or-name} is no longer displayed.
878
aeeedf76
MR
879The argument @var{buffer-or-name} may be a buffer or the name of an
880existing buffer and defaults to the current buffer.
520b29e7 881
0273ca3a
MR
882If a window displaying @var{buffer-or-name} is dedicated
883(@pxref{Dedicated Windows}), and is not the only window on its frame,
884that window is deleted. If that window is the only window on its frame
885and there are other frames left, the window's frame is deleted too. If
886there are no other frames left, some other buffer is displayed in that
887window.
250959e0 888
b8d4c8d0
GM
889This function returns @code{nil}.
890@end deffn
891
892@node Choosing Window
893@section Choosing a Window for Display
894
895 This section describes the basic facility that chooses a window to
0273ca3a 896display a buffer in---@code{display-buffer}. Higher-level functions and
a1401ab1 897commands, like @code{switch-to-buffer} and @code{pop-to-buffer}, use this
0273ca3a
MR
898subroutine. Here we describe how to use @code{display-buffer} and how
899to customize it.
b8d4c8d0
GM
900
901@deffn Command display-buffer buffer-or-name &optional not-this-window frame
52a94b85
MR
902This command makes @var{buffer-or-name} appear in some window, but it
903does 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
aeeedf76
MR
905unaltered by this function. The argument @var{buffer-or-name} must be a
906buffer or the name of an existing buffer.
b8d4c8d0 907
0273ca3a
MR
908@var{not-this-window} non-@code{nil} means to display the specified
909buffer in a window other than the selected one, even if it is already
910displayed in the selected window. This can cause the buffer to appear
911in two windows at once. Otherwise, if @var{buffer-or-name} is already
912being displayed in any window, that is good enough, so this function
913does nothing.
b8d4c8d0
GM
914
915@code{display-buffer} returns the window chosen to display
916@var{buffer-or-name}.
917
aeeedf76
MR
918If the optional argument @var{frame} is non-@code{nil}, it specifies
919which frames to check when deciding whether the buffer is already
920displayed. If the buffer is already displayed in some window on one of
921these frames, @code{display-buffer} simply returns that window. Here
922are the possible values of @var{frame}:
b8d4c8d0
GM
923
924@itemize @bullet
925@item
0273ca3a 926@code{nil} means consider windows on the selected frame.
b8d4c8d0
GM
927(Actually, the last non-minibuffer frame.)
928@item
0273ca3a 929@code{t} means consider windows on all frames.
b8d4c8d0 930@item
0273ca3a 931@code{visible} means consider windows on all visible frames.
b8d4c8d0 932@item
0273ca3a 9330 means consider windows on all visible or iconified frames.
b8d4c8d0 934@item
0273ca3a 935A frame means consider windows on that frame only.
b8d4c8d0
GM
936@end itemize
937
938Precisely how @code{display-buffer} finds or creates a window depends on
939the variables described below.
940@end deffn
941
52a94b85
MR
942@defopt display-buffer-reuse-frames
943If this variable is non-@code{nil}, @code{display-buffer} searches
b8766179
MR
944visible and iconified frames for a window displaying
945@var{buffer-or-name}. If there is such a window, @code{display-buffer}
946makes that window's frame visible and raises it if necessary, and
947returns the window. If there is no such window or
52a94b85
MR
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
951
952@defopt pop-up-windows
953This variable specifies whether @code{display-buffer} is allowed to
d3c0c321
MR
954split (@pxref{Splitting Windows}) an existing window. If this variable
955is non-@code{nil}, @code{display-buffer} tries to split the largest or
956least recently used window on the selected frame. (If the selected
957frame is a minibuffer-only frame, @code{display-buffer} tries to split a
958window on another frame instead.) If this variable is @code{nil} or the
b6474f84 959variable @code{pop-up-frames} (see below) is non-@code{nil},
52a94b85
MR
960@code{display-buffer} does not split any window.
961@end defopt
962
01f17ae2 963@defopt split-window-preferred-function
d3c0c321
MR
964This variable must specify a function with one argument, which is a
965window. The @code{display-buffer} routines will call this function with
966one or more candidate windows when they look for a window to split. The
967function is expected to split that window and return the new window. If
968the function returns @code{nil}, this means that the argument window
969cannot (or shall not) be split.
970
971The default value of @code{split-window-preferred-function} is the
714c3541 972function @code{split-window-sensibly} described below. If you
d3c0c321
MR
973customize this option, bear in mind that the @code{display-buffer}
974routines may call your function up to two times when trying to split a
975window. The argument of the first call is the largest window on the
976chosen frame (as returned by @code{get-largest-window}). If that call
977fails to return a live window, your function is called a second time
978with the least recently used window on that frame (as returned by
979@code{get-lru-window}).
980
714c3541
MR
981The function specified by this option may try to split any other window
982instead of the argument window. Note that the window selected at the
983time @code{display-buffer} was invoked is still selected when your
d3c0c321
MR
984function is called. Hence, you can split the selected window (instead
985of the largest or least recently used one) by simply ignoring the window
986argument in the body of your function. You can even choose to not split
987any window as long as the return value of your function specifies a live
714c3541
MR
988window or @code{nil}, but you are not encouraged to do so
989unconditionally. If you want @code{display-buffer} to never split any
990windows, set @code{pop-up-windows} to @code{nil}.
01f17ae2 991@end defopt
43c59a3d 992
714c3541 993@defun split-window-sensibly window
d3c0c321
MR
994This function takes a window as argument and tries to split that window
995in a suitable way. The two variables described next are useful for
996tuning the behavior of this function.
997@end defun
998
b8d4c8d0 999@defopt split-height-threshold
372a93ac
MR
1000This variable specifies whether @code{split-window-sensibly} may split
1001windows vertically. If it is an integer, @code{split-window-sensibly}
1002tries to vertically split a window only if it has at least this many
1003lines. If the window has less lines, splitting fails, or the value of
1004this variable is @code{nil}, @code{split-window-sensibly} will try to
1005split the window horizontally, subject to restrictions of
714c3541
MR
1006@code{split-width-threshold} (see below). If splitting horizontally
1007fails too and the window is the only window on its frame,
1008@code{split-window-sensibly} will try to split the window vertically
1009disregarding the value of @code{split-height-threshold}. If this fails
1010as well, @code{split-window-sensibly} returns @code{nil}.
1011
1012@code{split-window-sensibly} does not split vertically a window whose
1013height is fixed (@pxref{Resizing Windows}). Also, it vertically splits
1014a window only if the space taken up by that window can accommodate two
1015windows one above the other that are both at least
1016@code{window-min-height} lines tall. Moreover, if the window that shall
1017be split has a mode line, @code{split-window-sensibly} does not split
1018the window unless the new window can accomodate a mode line too.
43c59a3d
EZ
1019@end defopt
1020
1021@defopt split-width-threshold
372a93ac
MR
1022This variable specifies whether @code{split-window-sensibly} may split
1023windows horizontally. If it is an integer, @code{split-window-sensibly}
1024tries to horizontally split a window only if it has at least this many
1025columns. If it is @code{nil}, @code{split-window-sensibly} will not
1026split the window horizontally. (It still might split the window
714c3541
MR
1027vertically, though, see above.)
1028
1029@code{split-window-sensibly} does not split horizontally a window if
d3c0c321 1030that window's width is fixed (@pxref{Resizing Windows}). Also, it
714c3541 1031horizontally splits a window only if the space that window takes up can
d3c0c321
MR
1032accommodate two windows side by side that are both at least
1033@code{window-min-width} columns wide.
b8d4c8d0
GM
1034@end defopt
1035
1036@defopt even-window-heights
403b14d1 1037This variable specifies whether @code{display-buffer} should even out
52a94b85
MR
1038window heights if the buffer gets displayed in an existing window, above
1039or beneath another window. If @code{even-window-heights} is
1040non-@code{nil}, the default, window heights will be evened out. If
1041either of the involved window has fixed height (@pxref{Resizing
1042Windows}) or @code{even-window-heights} is @code{nil}, the original
1043window heights will be left alone.
b8d4c8d0
GM
1044@end defopt
1045
1046@c Emacs 19 feature
1047@defopt pop-up-frames
b8766179
MR
1048This variable specifies whether @code{display-buffer} should make new
1049frames. If it is non-@code{nil}, @code{display-buffer} looks for a
1050window already displaying @var{buffer-or-name} on any visible or
1051iconified frame. If it finds such a window, it makes that window's
1052frame visible and raises it if necessary, and returns the window.
1053Otherwise 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.
b8d4c8d0 1056
0273ca3a
MR
1057Note 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
1060one.
b8d4c8d0
GM
1061@end defopt
1062
1063@c Emacs 19 feature
1064@defopt pop-up-frame-function
1065This variable specifies how to make a new frame if @code{pop-up-frames}
1066is non-@code{nil}.
1067
b8766179 1068The value of this variable must be a function of no arguments. When
b8d4c8d0 1069@code{display-buffer} makes a new frame, it does so by calling that
b8766179
MR
1070function, which should return a frame. The default value of this
1071variable is a function that creates a frame using the parameters
1072specified by @code{pop-up-frame-alist} described next.
b8d4c8d0
GM
1073@end defopt
1074
1075@defopt pop-up-frame-alist
9f822178
MR
1076This variable holds an alist specifying frame parameters used by the
1077default value of @code{pop-up-frame-function} for making new frames.
1078@xref{Frame Parameters}, for more information about frame parameters.
b8d4c8d0
GM
1079@end defopt
1080
1081@defopt special-display-buffer-names
0273ca3a
MR
1082A list of buffer names identifying buffers that should be displayed
1083specially. If the name of @var{buffer-or-name} is in this list,
1084@code{display-buffer} handles the buffer specially. By default, special
1085display means to give the buffer a dedicated frame.
b8d4c8d0 1086
52a94b85
MR
1087If an element is a list, instead of a string, then the @sc{car} of that
1088list is the buffer name, and the rest of that list says how to create
1089the 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
b8d4c8d0
GM
1091contain a function and arguments to give to it. (The function's first
1092argument is always the buffer to be displayed; the arguments from the
1093list come after that.)
1094
1095For example:
1096
1097@example
1098(("myfile" (minibuffer) (menu-bar-lines . 0)))
1099@end example
1100
1101@noindent
1102specifies to display a buffer named @samp{myfile} in a dedicated frame
1103with specified @code{minibuffer} and @code{menu-bar-lines} parameters.
1104
1105The list of frame parameters can also use the phony frame parameters
1106@code{same-frame} and @code{same-window}. If the specified frame
1107parameters include @code{(same-window . @var{value})} and @var{value}
1108is non-@code{nil}, that means to display the buffer in the current
1109selected window. Otherwise, if they include @code{(same-frame .
1110@var{value})} and @var{value} is non-@code{nil}, that means to display
1111the buffer in a new window in the currently selected frame.
1112@end defopt
1113
1114@defopt special-display-regexps
0273ca3a 1115A list of regular expressions specifying buffers that should be
b8d4c8d0
GM
1116displayed specially. If the buffer's name matches any of the regular
1117expressions in this list, @code{display-buffer} handles the buffer
0273ca3a
MR
1118specially. By default, special display means to give the buffer a
1119dedicated frame.
b8d4c8d0
GM
1120
1121If an element is a list, instead of a string, then the @sc{car} of the
1122list is the regular expression, and the rest of the list says how to
0273ca3a 1123create the frame. See @code{special-display-buffer-names} above.
b8d4c8d0
GM
1124@end defopt
1125
1126@defun special-display-p buffer-name
1127This function returns non-@code{nil} if displaying a buffer
1128named @var{buffer-name} with @code{display-buffer} would
1129create a special frame. The value is @code{t} if it would
1130use the default frame parameters, or else the specified list
1131of frame parameters.
1132@end defun
1133
01f17ae2 1134@defopt special-display-function
b8d4c8d0
GM
1135This variable holds the function to call to display a buffer specially.
1136It receives the buffer as an argument, and should return the window in
0273ca3a
MR
1137which it is displayed. The default value of this variable is
1138@code{special-display-popup-frame}, see below.
01f17ae2 1139@end defopt
b8d4c8d0
GM
1140
1141@defun special-display-popup-frame buffer &optional args
0273ca3a
MR
1142This function tries to make @var{buffer} visible in a frame of its own.
1143If @var{buffer} is already displayed in some window, it makes that
1144window's frame visible and raises it. Otherwise, it creates a frame
1145that is dedicated to @var{buffer}. The return value is the window used
1146to display @var{buffer}.
b8d4c8d0
GM
1147
1148If @var{args} is an alist, it specifies frame parameters for the new
0273ca3a
MR
1149frame. 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
1151set up the frame; it is called with @var{buffer} as first argument, and
1152@code{(cdr @var{args})} as additional arguments.
b8d4c8d0
GM
1153
1154This function always uses an existing window displaying @var{buffer},
1155whether or not it is in a frame of its own; but if you set up the above
1156variables in your init file, before @var{buffer} was created, then
1157presumably the window was previously made by this function.
1158@end defun
1159
1160@defopt special-display-frame-alist
1161@anchor{Definition of special-display-frame-alist}
1162This variable holds frame parameters for
1163@code{special-display-popup-frame} to use when it creates a frame.
1164@end defopt
1165
1166@defopt same-window-buffer-names
1167A list of buffer names for buffers that should be displayed in the
1168selected window. If the buffer's name is in this list,
1169@code{display-buffer} handles the buffer by switching to it in the
1170selected window.
1171@end defopt
1172
1173@defopt same-window-regexps
1174A list of regular expressions that specify buffers that should be
1175displayed in the selected window. If the buffer's name matches any of
1176the regular expressions in this list, @code{display-buffer} handles the
1177buffer by switching to it in the selected window.
1178@end defopt
1179
1180@defun same-window-p buffer-name
1181This function returns @code{t} if displaying a buffer
1182named @var{buffer-name} with @code{display-buffer} would
1183put it in the selected window.
1184@end defun
1185
1186@c Emacs 19 feature
01f17ae2 1187@defopt display-buffer-function
b8d4c8d0
GM
1188This 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
1190that @code{display-buffer} calls to do the work. The function should
1191accept two arguments, the first two arguments that @code{display-buffer}
1192received. It should choose or create a window, display the specified
1193buffer in it, and then return the window.
1194
52a94b85
MR
1195This variable takes precedence over all the other options described
1196above.
01f17ae2 1197@end defopt
b8d4c8d0 1198
52a94b85 1199If all options described above fail to produce a suitable window,
0273ca3a
MR
1200@code{display-buffer} tries to reuse an existing window. As a last
1201resort, it will try to display @var{buffer-or-name} on a separate frame.
1202In that case, the value of @code{pop-up-frames} is disregarded.
1203
1204@node Dedicated Windows
1205@section Dedicated Windows
1206@cindex dedicated window
1207
1208Functions for displaying a buffer can be told to not use specific
df006536 1209windows by marking these windows as @dfn{dedicated} to their buffers.
0273ca3a
MR
1210@code{display-buffer} (@pxref{Choosing Window}) never uses a dedicated
1211window for displaying another buffer in it. @code{get-lru-window} and
1212@code{get-largest-window} (@pxref{Selecting Windows}) do not consider
1213dedicated windows as candidates when their @var{dedicated} argument is
1214non-@code{nil}. The behavior of @code{set-window-buffer}
1215(@pxref{Buffers and Windows}) with respect to dedicated windows is
1216slightly different, see below.
1217
1218When @code{delete-windows-on} (@pxref{Deleting Windows}) wants to delete
1219a dedicated window and that window is the only window on its frame, it
1220deletes the window's frame too, provided there are other frames left.
1221@code{replace-buffer-in-windows} (@pxref{Displaying Buffers}) tries to
1222delete all dedicated windows showing its buffer argument. When such a
1223window is the only window on its frame, that frame is deleted, provided
1224there are other frames left. If there are no more frames left, some
1225other buffer is displayed in the window, and the window is marked as
1226non-dedicated.
1227
1228When you kill a buffer (@pxref{Killing Buffers}) displayed in a
1229dedicated window, any such window usually gets deleted too, since
1230@code{kill-buffer} calls @code{replace-buffer-in-windows} for cleaning
1231up windows. Burying a buffer (@pxref{The Buffer List}) deletes the
b8766179
MR
1232selected window if it is dedicated to that buffer. If, however, that
1233window is the only window on its frame, @code{bury-buffer} displays
1234another buffer in it and iconifies the frame.
250959e0
MR
1235
1236@defun window-dedicated-p &optional window
52a94b85
MR
1237This function returns non-@code{nil} if @var{window} is dedicated to its
1238buffer and @code{nil} otherwise. More precisely, the return value is
1239the 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
aeeedf76
MR
1241@var{window} as its argument. The default for @var{window} is the
1242selected window.
b8d4c8d0
GM
1243@end defun
1244
1245@defun set-window-dedicated-p window flag
52a94b85
MR
1246This function marks @var{window} as dedicated to its buffer if
1247@var{flag} is non-@code{nil}, and non-dedicated otherwise.
52a94b85 1248
0273ca3a
MR
1249As a special case, if @var{flag} is @code{t}, @var{window} becomes
1250@dfn{strongly} dedicated to its buffer. @code{set-window-buffer}
1251signals an error when the window it acts upon is strongly dedicated to
1252its buffer and does not already display the buffer it is asked to
b8766179
MR
1253display. Other functions do not treat @code{t} differently from any
1254non-@code{nil} value.
0273ca3a 1255@end defun
52a94b85 1256
b8d4c8d0
GM
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
1263
0273ca3a
MR
1264 Each window has its own value of point (@pxref{Point}), independent of
1265the value of point in other windows displaying the same buffer. This
1266makes it useful to have multiple windows showing one buffer.
b8d4c8d0
GM
1267
1268@itemize @bullet
1269@item
1270The window point is established when a window is first created; it is
1271initialized from the buffer's point, or from the window point of another
1272window opened on the buffer if such a window exists.
1273
1274@item
1275Selecting a window sets the value of point in its buffer from the
1276window's value of point. Conversely, deselecting a window sets the
1277window's value of point from that of the buffer. Thus, when you switch
1278between windows that display a given buffer, the point value for the
1279selected window is in effect in the buffer, while the point values for
1280the other windows are stored in those windows.
1281
1282@item
1283As long as the selected window displays the current buffer, the window's
1284point and the buffer's point always move together; they remain equal.
1285@end itemize
1286
b8d4c8d0 1287@cindex cursor
af1a5cd5 1288 As far as the user is concerned, point is where the cursor is, and
b8d4c8d0
GM
1289when the user switches to another buffer, the cursor jumps to the
1290position of point in that buffer.
1291
1292@defun window-point &optional window
1293This function returns the current position of point in @var{window}.
1294For a nonselected window, this is the value point would have (in that
aeeedf76
MR
1295window's buffer) if that window were selected. The default for
1296@var{window} is the selected window.
b8d4c8d0
GM
1297
1298When @var{window} is the selected window and its buffer is also the
1299current buffer, the value returned is the same as point in that buffer.
0273ca3a
MR
1300Strictly speaking, it would be more correct to return the ``top-level''
1301value of point, outside of any @code{save-excursion} forms. But that
1302value is hard to find.
b8d4c8d0
GM
1303@end defun
1304
1305@defun set-window-point window position
1306This function positions point in @var{window} at position
1307@var{position} in @var{window}'s buffer. It returns @var{position}.
1308
1309If @var{window} is selected, and its buffer is current,
1310this simply does @code{goto-char}.
1311@end defun
1312
86ab855a
MR
1313@defvar window-point-insertion-type
1314This variable specifies the marker insertion type (@pxref{Marker
1315Insertion Types}) of @code{window-point}. The default is @code{nil},
1316so @code{window-point} will stay behind text inserted there.
1317@end defvar
1318
0273ca3a
MR
1319@node Window Start and End
1320@section The Window Start and End Positions
b8d4c8d0
GM
1321@cindex window start position
1322
0273ca3a 1323 Each window maintains a marker used to keep track of a buffer position
b8d4c8d0
GM
1324that specifies where in the buffer display should start. This position
1325is 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
1327at the upper left corner of the window. It is usually, but not
1328inevitably, at the beginning of a text line.
1329
431b78c9
RS
1330 After switching windows or buffers, and in some other cases, if the
1331window start is in the middle of a line, Emacs adjusts the window
1332start to the start of a line. This prevents certain operations from
1333leaving the window start at a meaningless point within a line. This
1334feature may interfere with testing some Lisp code by executing it
1335using the commands of Lisp mode, because they trigger this
1336readjustment. To test such code, put it into a command and bind the
1337command to a key.
1338
b8d4c8d0
GM
1339@defun window-start &optional window
1340@cindex window top line
1341This function returns the display-start position of window
1342@var{window}. If @var{window} is @code{nil}, the selected window is
1343used. For example,
1344
1345@example
1346@group
1347(window-start)
1348 @result{} 7058
1349@end group
1350@end example
1351
1352When you create a window, or display a different buffer in it, the
1353display-start position is set to a display-start position recently used
0273ca3a
MR
1354for the same buffer, or to @code{point-min} if the buffer doesn't have
1355any.
b8d4c8d0
GM
1356
1357Redisplay updates the window-start position (if you have not specified
0273ca3a
MR
1358it explicitly since the previous redisplay)---to make sure point appears
1359on the screen. Nothing except redisplay automatically changes the
1360window-start position; if you move point, do not expect the window-start
1361position to change in response until after the next redisplay.
b8d4c8d0
GM
1362
1363For a realistic example of using @code{window-start}, see the
1364description of @code{count-lines}. @xref{Definition of count-lines}.
1365@end defun
1366
0273ca3a 1367@cindex window end position
b8d4c8d0 1368@defun window-end &optional window update
0273ca3a 1369This function returns the position where display of its buffer ends in
aeeedf76 1370@var{window}. The default for @var{window} is the selected window.
b8d4c8d0
GM
1371
1372Simply changing the buffer text or moving point does not update the
1373value that @code{window-end} returns. The value is updated only when
1374Emacs redisplays and redisplay completes without being preempted.
1375
1376If the last redisplay of @var{window} was preempted, and did not finish,
1377Emacs does not know the position of the end of display in that window.
1378In that case, this function returns @code{nil}.
1379
1380If @var{update} is non-@code{nil}, @code{window-end} always returns an
0273ca3a
MR
1381up-to-date value for where display ends, based on the current
1382@code{window-start} value. If a previously saved value of that position
1383is still valid, @code{window-end} returns that value; otherwise it
1384computes the correct value by scanning the buffer text.
b8d4c8d0
GM
1385
1386Even if @var{update} is non-@code{nil}, @code{window-end} does not
1387attempt to scroll the display if point has moved off the screen, the
1388way real redisplay would do. It does not alter the
1389@code{window-start} value. In effect, it reports where the displayed
1390text will end if scrolling is not required.
1391@end defun
1392
1393@defun set-window-start window position &optional noforce
1394This function sets the display-start position of @var{window} to
1395@var{position} in @var{window}'s buffer. It returns @var{position}.
1396
1397The display routines insist that the position of point be visible when a
1398buffer is displayed. Normally, they change the display-start position
1399(that is, scroll the window) whenever necessary to make point visible.
1400However, 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
1403screen. If this does place point off screen, the display routines move
1404point to the left margin on the middle line in the window.
1405
431b78c9
RS
1406For 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
1408of the window. The display routines will automatically move point if
1409it is still 1 when redisplay occurs. Here is an example:
b8d4c8d0
GM
1410
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
1416
1417@group
1418---------- Buffer: foo ----------
1419@point{}This is the contents of buffer foo.
14202
14213
14224
14235
14246
1425---------- Buffer: foo ----------
1426@end group
1427
1428@group
1429(set-window-start
1430 (selected-window)
431b78c9
RS
1431 (save-excursion
1432 (goto-char 1)
1433 (forward-line 1)
1434 (point)))
1435@result{} 37
b8d4c8d0
GM
1436@end group
1437
1438@group
1439;; @r{Here is what @samp{foo} looks like after executing}
1440;; @r{the @code{set-window-start} expression.}
1441---------- Buffer: foo ----------
b8d4c8d0
GM
14422
14433
1444@point{}4
14455
14466
1447---------- Buffer: foo ----------
1448@end group
1449@end example
1450
1451If @var{noforce} is non-@code{nil}, and @var{position} would place point
1452off screen at the next redisplay, then redisplay computes a new window-start
1453position that works well with point, and thus @var{position} is not used.
1454@end defun
1455
1456@defun pos-visible-in-window-p &optional position window partially
1457This function returns non-@code{nil} if @var{position} is within the
1458range of text currently visible on the screen in @var{window}. It
0273ca3a
MR
1459returns @code{nil} if @var{position} is scrolled vertically out of view.
1460Locations that are partially obscured are not considered visible unless
1461@var{partially} is non-@code{nil}. The argument @var{position} defaults
1462to the current position of point in @var{window}; @var{window}, to the
1463selected window. If @var{position} is @code{t}, that means to check the
1464last visible position in @var{window}.
b8d4c8d0
GM
1465
1466The @code{pos-visible-in-window-p} function considers only vertical
1467scrolling. If @var{position} is out of view only because @var{window}
1468has been scrolled horizontally, @code{pos-visible-in-window-p} returns
1469non-@code{nil} anyway. @xref{Horizontal Scrolling}.
1470
1471If @var{position} is visible, @code{pos-visible-in-window-p} returns
1472@code{t} if @var{partially} is @code{nil}; if @var{partially} is
0273ca3a 1473non-@code{nil}, and the character following @var{position} is fully
b8d4c8d0
GM
1474visible, 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
0273ca3a
MR
1476corner 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})},
1478where @var{rtop} and @var{rbot} specify the number of off-window pixels
1479at the top and bottom of the row at @var{position}, @var{rowh} specifies
1480the visible height of that row, and @var{vpos} specifies the vertical
1481position (zero-based row number) of that row.
b8d4c8d0
GM
1482
1483Here is an example:
1484
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
1494
1495@defun window-line-height &optional line window
aeeedf76
MR
1496This 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
1499the corresponding line of the window. Otherwise, @var{line} is a text
1500line number starting from 0. A negative number counts from the end of
1501the window. The default for @var{line} is the current line in
1502@var{window}; the default for @var{window} is the selected window.
b8d4c8d0
GM
1503
1504If 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
1506to obtain related information.
1507
1508If there is no line corresponding to the specified @var{line},
1509@code{window-line-height} returns @code{nil}. Otherwise, it returns
1510a list @code{(@var{height} @var{vpos} @var{ypos} @var{offbot})},
1511where @var{height} is the height in pixels of the visible part of the
1512line, @var{vpos} and @var{ypos} are the vertical position in lines and
1513pixels 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
1515text line. If there are off-window pixels at the top of the (first)
1516text line, @var{ypos} is negative.
1517@end defun
1518
1519@node Textual Scrolling
1520@section Textual Scrolling
1521@cindex textual scrolling
1522@cindex scrolling textually
1523
1524 @dfn{Textual scrolling} means moving the text up or down through a
1525window. It works by changing the value of the window's display-start
1526location. It may also change the value of @code{window-point} to keep
1527point on the screen.
1528
1529 Textual scrolling was formerly called ``vertical scrolling,'' but we
1530changed its name to distinguish it from the new vertical fractional
1531scrolling feature (@pxref{Vertical Scrolling}).
1532
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
1535you are looking through the window. Imagine that the text is
1536written on a long roll of paper and that the scrolling commands move the
1537paper up and down. Thus, if you are looking at text in the middle of a
1538buffer and repeatedly call @code{scroll-down}, you will eventually see
1539the beginning of the buffer.
1540
1541 Some people have urged that the opposite convention be used: they
1542imagine 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
1544more consistent with the actual relationship between windows and the
1545text in the buffer, but it is less like what the user sees. The
1546position of a window on the terminal does not move, and short scrolling
1547commands clearly move the text up or down on the screen. We have chosen
1548names that fit the user's point of view.
1549
1550 The textual scrolling functions (aside from
1551@code{scroll-other-window}) have unpredictable results if the current
1552buffer is different from the buffer that is displayed in the selected
1553window. @xref{Current Buffer}.
1554
1555 If the window contains a row which is taller than the height of the
1556window (for example in the presence of a large image), the scroll
b8766179
MR
1557functions will adjust the window's vertical scroll position to scroll
1558the partially visible row. To disable this feature, Lisp code may bind
1559the variable @code{auto-window-vscroll} to @code{nil} (@pxref{Vertical
1560Scrolling}).
b8d4c8d0
GM
1561
1562@deffn Command scroll-up &optional count
1563This function scrolls the text in the selected window upward
1564@var{count} lines. If @var{count} is negative, scrolling is actually
1565downward.
1566
1567If @var{count} is @code{nil} (or omitted), then the length of scroll
1568is @code{next-screen-context-lines} lines less than the usable height of
1569the window (not counting its mode line).
1570
1571@code{scroll-up} returns @code{nil}, unless it gets an error
1572because it can't scroll any further.
1573@end deffn
1574
1575@deffn Command scroll-down &optional count
1576This function scrolls the text in the selected window downward
1577@var{count} lines. If @var{count} is negative, scrolling is actually
1578upward.
1579
1580If @var{count} is omitted or @code{nil}, then the length of the scroll
1581is @code{next-screen-context-lines} lines less than the usable height of
1582the window (not counting its mode line).
1583
1584@code{scroll-down} returns @code{nil}, unless it gets an error because
1585it can't scroll any further.
1586@end deffn
1587
1588@deffn Command scroll-other-window &optional count
1589This function scrolls the text in another window upward @var{count}
1590lines. Negative values of @var{count}, or @code{nil}, are handled
1591as in @code{scroll-up}.
1592
1593You can specify which buffer to scroll by setting the variable
1594@code{other-window-scroll-buffer} to a buffer. If that buffer isn't
1595already displayed, @code{scroll-other-window} displays it in some
1596window.
1597
1598When the selected window is the minibuffer, the next window is normally
1599the one at the top left corner. You can specify a different window to
1600scroll, when the minibuffer is selected, by setting the variable
1601@code{minibuffer-scroll-window}. This variable has no effect when any
1602other window is selected. When it is non-@code{nil} and the
1603minibuffer is selected, it takes precedence over
1604@code{other-window-scroll-buffer}. @xref{Definition of
1605minibuffer-scroll-window}.
1606
1607When the minibuffer is active, it is the next window if the selected
1608window is the one at the bottom right corner. In this case,
1609@code{scroll-other-window} attempts to scroll the minibuffer. If the
1610minibuffer contains just one line, it has nowhere to scroll to, so the
1611line reappears after the echo area momentarily displays the message
1612@samp{Beginning of buffer}.
1613@end deffn
1614
1615@c Emacs 19 feature
1616@defvar other-window-scroll-buffer
1617If this variable is non-@code{nil}, it tells @code{scroll-other-window}
0273ca3a 1618which buffer's window to scroll.
b8d4c8d0
GM
1619@end defvar
1620
1621@defopt scroll-margin
1622This option specifies the size of the scroll margin---a minimum number
1623of lines between point and the top or bottom of a window. Whenever
1624point gets within this many lines of the top or bottom of the window,
1625redisplay scrolls the text automatically (if possible) to move point
1626out of the margin, closer to the center of the window.
1627@end defopt
1628
1629@defopt scroll-conservatively
1630This variable controls how scrolling is done automatically when point
1631moves off the screen (or into the scroll margin). If the value is a
1632positive integer @var{n}, then redisplay scrolls the text up to
1633@var{n} lines in either direction, if that will bring point back into
0273ca3a 1634proper view. This behavior is called @dfn{conservative scrolling}.
b8d4c8d0
GM
1635Otherwise, scrolling happens in the usual way, under the control of
1636other variables such as @code{scroll-up-aggressively} and
1637@code{scroll-down-aggressively}.
1638
1639The default value is zero, which means that conservative scrolling
1640never happens.
1641@end defopt
1642
1643@defopt scroll-down-aggressively
1644The 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
1646the screen to put point when scrolling down. More precisely, when a
1647window scrolls down because point is above the window start, the new
1648start position is chosen to put point @var{f} part of the window
1649height from the top. The larger @var{f}, the more aggressive the
1650scrolling.
1651
1652A value of @code{nil} is equivalent to .5, since its effect is to center
1653point. This variable automatically becomes buffer-local when set in any
1654fashion.
1655@end defopt
1656
1657@defopt scroll-up-aggressively
1658Likewise, for scrolling up. The value, @var{f}, specifies how far
1659point 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
1662
1663@defopt scroll-step
1664This variable is an older variant of @code{scroll-conservatively}. The
1665difference is that it if its value is @var{n}, that permits scrolling
1666only by precisely @var{n} lines, not a smaller number. This feature
1667does not work with @code{scroll-margin}. The default value is zero.
1668@end defopt
1669
1670@defopt scroll-preserve-screen-position
1671If this option is @code{t}, scrolling which would move the current
1672point position out of the window chooses the new position of point
1673so that the vertical position of the cursor is unchanged, if possible.
1674
1675If it is non-@code{nil} and not @code{t}, then the scrolling functions
1676always preserve the vertical position of point, if possible.
1677@end defopt
1678
1679@defopt next-screen-context-lines
1680The value of this variable is the number of lines of continuity to
1681retain when scrolling by full screens. For example, @code{scroll-up}
1682with an argument of @code{nil} scrolls so that this many lines at the
1683bottom of the window appear instead at the top. The default value is
1684@code{2}.
1685@end defopt
1686
1687@deffn Command recenter &optional count
1688@cindex centering point
1689This function scrolls the text in the selected window so that point is
1690displayed at a specified vertical position within the window. It does
1691not ``move point'' with respect to the text.
1692
1693If @var{count} is a nonnegative number, that puts the line containing
1694point @var{count} lines down from the top of the window. If
1695@var{count} is a negative number, then it counts upward from the
1696bottom of the window, so that @minus{}1 stands for the last usable
1697line in the window. If @var{count} is a non-@code{nil} list, then it
1698stands for the line in the middle of the window.
1699
1700If @var{count} is @code{nil}, @code{recenter} puts the line containing
1701point in the middle of the window, then clears and redisplays the entire
1702selected frame.
1703
1704When @code{recenter} is called interactively, @var{count} is the raw
1705prefix 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
1708top.
1709
1710With an argument of zero, @code{recenter} positions the current line at
1711the top of the window. This action is so handy that some people make a
1712separate key binding to do this. For example,
1713
1714@example
1715@group
1716(defun line-to-top-of-window ()
1717 "Scroll current line to top of window.
1718Replaces three keystroke sequence C-u 0 C-l."
1719 (interactive)
1720 (recenter 0))
1721
1722(global-set-key [kp-multiply] 'line-to-top-of-window)
1723@end group
1724@end example
1725@end deffn
1726
1727@node Vertical Scrolling
1728@section Vertical Fractional Scrolling
1729@cindex vertical fractional scrolling
0273ca3a 1730@cindex vertical scroll position
b8d4c8d0 1731
af1a5cd5
MR
1732 @dfn{Vertical fractional scrolling} means shifting text in a window
1733up or down by a specified multiple or fraction of a line. Each window
1734has a @dfn{vertical scroll position}, which is a number, never less than
0273ca3a
MR
1735zero. It specifies how far to raise the contents of the window.
1736Raising the window contents generally makes all or part of some lines
1737disappear off the top, and all or part of some other lines appear at the
1738bottom. The usual value is zero.
b8d4c8d0 1739
af1a5cd5 1740 The vertical scroll position is measured in units of the normal line
b8d4c8d0
GM
1741height, 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
1743height. If it is 3.3, that means the window contents are scrolled up
1744somewhat over three times the normal line height.
1745
af1a5cd5 1746 What fraction of a line the vertical scrolling covers, or how many
b8d4c8d0
GM
1747lines, depends on what the lines contain. A value of .5 could scroll a
1748line whose height is very short off the screen, while a value of 3.3
1749could scroll just part of the way through a tall line or an image.
1750
1751@defun window-vscroll &optional window pixels-p
1752This function returns the current vertical scroll position of
aeeedf76
MR
1753@var{window}. The default for @var{window} is the selected window.
1754If @var{pixels-p} is non-@code{nil}, the return value is measured in
0273ca3a 1755pixels, rather than in units of the normal line height.
b8d4c8d0
GM
1756
1757@example
1758@group
1759(window-vscroll)
1760 @result{} 0
1761@end group
1762@end example
1763@end defun
1764
1765@defun set-window-vscroll window lines &optional pixels-p
1766This function sets @var{window}'s vertical scroll position to
0273ca3a
MR
1767@var{lines}. If @var{window} is @code{nil}, the selected window is
1768used. The argument @var{lines} should be zero or positive; if not, it
1769is taken as zero.
b8d4c8d0 1770
b8d4c8d0
GM
1771
1772The actual vertical scroll position must always correspond
1773to an integral number of pixels, so the value you specify
1774is rounded accordingly.
1775
1776The return value is the result of this rounding.
1777
1778@example
1779@group
1780(set-window-vscroll (selected-window) 1.2)
1781 @result{} 1.13
1782@end group
1783@end example
1784
1785If @var{pixels-p} is non-@code{nil}, @var{lines} specifies a number of
1786pixels. In this case, the return value is @var{lines}.
1787@end defun
1788
1789@defvar auto-window-vscroll
1790If this variable is non-@code{nil}, the line-move, scroll-up, and
0273ca3a 1791scroll-down functions will automatically modify the vertical scroll
b8766179 1792position to scroll through display rows that are taller than the height
0273ca3a 1793of the window, for example in the presence of large images.
b8d4c8d0
GM
1794@end defvar
1795
1796@node Horizontal Scrolling
1797@section Horizontal Scrolling
1798@cindex horizontal scrolling
1799
1800 @dfn{Horizontal scrolling} means shifting the image in the window left
1801or right by a specified multiple of the normal character width. Each
1802window has a @dfn{horizontal scroll position}, which is a number, never
1803less than zero. It specifies how far to shift the contents left.
1804Shifting the window contents left generally makes all or part of some
1805characters disappear off the left, and all or part of some other
1806characters appear at the right. The usual value is zero.
1807
1808 The horizontal scroll position is measured in units of the normal
1809character width, which is the width of space in the default font. Thus,
1810if the value is 5, that means the window contents are scrolled left by 5
1811times the normal character width. How many characters actually
1812disappear off to the left depends on their width, and could vary from
1813line to line.
1814
1815 Because we read from side to side in the ``inner loop,'' and from top
1816to bottom in the ``outer loop,'' the effect of horizontal scrolling is
1817not like that of textual or vertical scrolling. Textual scrolling
1818involves selection of a portion of text to display, and vertical
1819scrolling moves the window contents contiguously; but horizontal
1820scrolling causes part of @emph{each line} to go off screen.
1821
1822 Usually, no horizontal scrolling is in effect; then the leftmost
1823column is at the left edge of the window. In this state, scrolling to
1824the right is meaningless, since there is no data to the left of the edge
1825to be revealed by it; so this is not allowed. Scrolling to the left is
1826allowed; it scrolls the first columns of text off the edge of the window
1827and can reveal additional columns on the right that were truncated
1828before. Once a window has a nonzero amount of leftward horizontal
1829scrolling, you can scroll it back to the right, but only so far as to
1830reduce the net horizontal scroll to zero. There is no limit to how far
1831left you can scroll, but eventually all the text will disappear off the
1832left edge.
1833
1834@vindex auto-hscroll-mode
1835 If @code{auto-hscroll-mode} is set, redisplay automatically alters
1836the horizontal scrolling of a window as necessary to ensure that point
1837is always visible. However, you can still set the horizontal
1838scrolling value explicitly. The value you specify serves as a lower
1839bound for automatic scrolling, i.e. automatic scrolling will not
1840scroll a window to a column less than the specified one.
1841
1842@deffn Command scroll-left &optional count set-minimum
1843This function scrolls the selected window @var{count} columns to the
1844left (or to the right if @var{count} is negative). The default
1845for @var{count} is the window width, minus 2.
1846
1847The return value is the total amount of leftward horizontal scrolling in
1848effect after the change---just like the value returned by
1849@code{window-hscroll} (below).
1850
1851Once you scroll a window as far right as it can go, back to its normal
1852position where the total leftward scrolling is zero, attempts to scroll
1853any farther right have no effect.
1854
1855If @var{set-minimum} is non-@code{nil}, the new scroll amount becomes
1856the lower bound for automatic scrolling; that is, automatic scrolling
1857will not scroll a window to a column less than the value returned by
1858this function. Interactive calls pass non-@code{nil} for
1859@var{set-minimum}.
1860@end deffn
1861
1862@deffn Command scroll-right &optional count set-minimum
1863This function scrolls the selected window @var{count} columns to the
1864right (or to the left if @var{count} is negative). The default
1865for @var{count} is the window width, minus 2. Aside from the direction
1866of scrolling, this works just like @code{scroll-left}.
1867@end deffn
1868
1869@defun window-hscroll &optional window
1870This function returns the total leftward horizontal scrolling of
1871@var{window}---the number of columns by which the text in @var{window}
aeeedf76
MR
1872is scrolled left past the left margin. The default for
1873@var{window} is the selected window.
b8d4c8d0 1874
0273ca3a
MR
1875The return value is never negative. It is zero when no horizontal
1876scrolling has been done in @var{window} (which is usually the case).
b8d4c8d0 1877
b8d4c8d0
GM
1878
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
1894
1895@defun set-window-hscroll window columns
1896This function sets horizontal scrolling of @var{window}. The value of
1897@var{columns} specifies the amount of scrolling, in terms of columns
1898from the left margin. The argument @var{columns} should be zero or
1899positive; if not, it is taken as zero. Fractional values of
1900@var{columns} are not supported at present.
1901
1902Note that @code{set-window-hscroll} may appear not to work if you test
1903it by evaluating a call with @kbd{M-:} in a simple way. What happens
1904is that the function sets the horizontal scroll value and returns, but
1905then redisplay adjusts the horizontal scrolling to make point visible,
1906and this overrides what the function did. You can observe the
1907function's effect if you call it while point is sufficiently far from
1908the left margin that it will remain visible.
1909
1910The value returned is @var{columns}.
1911
1912@example
1913@group
1914(set-window-hscroll (selected-window) 10)
1915 @result{} 10
1916@end group
1917@end example
1918@end defun
1919
af1a5cd5
MR
1920 Here is how you can determine whether a given position @var{position}
1921is off the screen due to horizontal scrolling:
b8d4c8d0
GM
1922
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
1934
1935@node Size of Window
1936@section The Size of a Window
1937@cindex window size
1938@cindex size of window
1939
1940 An Emacs window is rectangular, and its size information consists of
1941the height (the number of lines) and the width (the number of character
1942positions in each line). The mode line is included in the height. But
1943the width does not count the scroll bar or the column of @samp{|}
1944characters that separates side-by-side windows.
1945
1946 The following three functions return size information about a window:
1947
1948@defun window-height &optional window
0c5413c8
GM
1949This function returns the number of lines in @var{window} (by default
1950the selected window), including any mode line and header line.
1951The result is almost always less than the value of @code{frame-height}
1952for the associated frame, because the latter also includes any echo
1953area. Depending on the toolkit in use, the frame height can also
1954include the menu bar and tool bar (@pxref{Size and Position}).
1955Therefore in general it is not straightforward to compare window and
1956frame heights (see @code{window-full-height-p} below).
b8d4c8d0
GM
1957
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
1973
1974@defun window-body-height &optional window
1975Like @code{window-height} but the value does not include the
1976mode line (if any) or the header line (if any).
1977@end defun
1978
0c5413c8
GM
1979@defun window-full-height-p &optional window
1980This function returns non-@code{nil} if @var{window} is as tall as the
1981frame that contains it. The default for @var{window} is the selected
1982window.
1983@end defun
1984
b8d4c8d0 1985@defun window-width &optional window
aeeedf76
MR
1986This function returns the number of columns in @var{window}. The
1987default for @var{window} is the selected window.
b8d4c8d0 1988
0273ca3a
MR
1989The return value does not include the window's scroll bar or the column
1990of @samp{|} characters that separates side-by-side windows. Moreover,
1991the return value does not include the space used for displaying fringes
1992and margins. Hence you cannot, in general, compare the return values of
1993@code{window-width} and @code{frame-width} for equality to determine
1994whether a window is a wide as the containing frame. Use the function
1995@code{window-full-width-p}, see below, instead.
b8d4c8d0
GM
1996
1997@example
1998@group
1999(window-width)
2000 @result{} 80
2001@end group
2002@end example
2003@end defun
2004
2005@defun window-full-width-p &optional window
0273ca3a 2006This function returns non-@code{nil} if @var{window} is as wide as the
aeeedf76
MR
2007frame that contains it; otherwise @code{nil}. The default for
2008@var{window} is the selected window.
b8d4c8d0
GM
2009@end defun
2010
2011@defun window-edges &optional window
2012This function returns a list of the edge coordinates of @var{window}.
aeeedf76 2013The default for @var{window} is the selected window.
b8d4c8d0
GM
2014
2015The 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
2017the frame. The element @var{right} of the value is one more than the
2018rightmost column used by @var{window}, and @var{bottom} is one more than
2019the bottommost row used by @var{window} and its mode-line.
2020
2021The edges include the space used by the window's scroll bar, display
2022margins, fringes, header line, and mode line, if it has them. Also,
2023if the window has a neighbor on the right, its right edge value
2024includes the width of the separator line between the window and that
2025neighbor. Since the width of the window does not include this
2026separator, the width does not usually equal the difference between the
2027right and left edges.
2028@end defun
2029
2030@defun window-inside-edges &optional window
2031This is similar to @code{window-edges}, but the edge values
2032it returns include only the text area of the window. They
2033do not include the header line, mode line, scroll bar or
2034vertical separator, fringes, or display margins.
2035@end defun
2036
2037Here are the results obtained on a typical 24-line terminal with just
2038one window, with menu bar enabled:
2039
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
2050
2051@noindent
2052The bottom edge is at line 23 because the last line is the echo area.
2053The bottom inside edge is at line 22, which is the window's mode line.
2054
2055If @var{window} is at the upper left corner of its frame, and there is
2056no menu bar, then @var{bottom} returned by @code{window-edges} is the
2057same as the value of @code{(window-height)}, @var{right} is almost the
2058same as the value of @code{(window-width)}, and @var{top} and
2059@var{left} are zero. For example, the edges of the following window
2060are @w{@samp{0 0 8 5}}. Assuming that the frame has more than 8
2061columns, the last column of the window (column 7) holds a border
2062rather than text. The last row (row 4) holds the mode line, shown
2063here with @samp{xxxxxxxxx}.
2064
2065@example
2066@group
2067 0
2068 _______
2069 0 | |
2070 | |
2071 | |
2072 | |
2073 xxxxxxxxx 4
2074
2075 7
2076@end group
2077@end example
2078
2079In the following example, let's suppose that the frame is 7
2080columns wide. Then the edges of the left window are @w{@samp{0 0 4 3}}
2081and the edges of the right window are @w{@samp{4 0 7 3}}.
2082The inside edges of the left window are @w{@samp{0 0 3 2}},
2083and the inside edges of the right window are @w{@samp{4 0 7 2}},
2084
2085@example
2086@group
2087 ___ ___
2088 | | |
2089 | | |
2090 xxxxxxxxx
2091
2092 0 34 7
2093@end group
2094@end example
2095
2096@defun window-pixel-edges &optional window
2097This function is like @code{window-edges} except that, on a graphical
2098display, the edge values are measured in pixels instead of in
2099character lines and columns.
2100@end defun
2101
2102@defun window-inside-pixel-edges &optional window
2103This function is like @code{window-inside-edges} except that, on a
2104graphical display, the edge values are measured in pixels instead of
2105in character lines and columns.
2106@end defun
2107
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
2114
af1a5cd5 2115 The window size functions fall into two classes: high-level commands
b8d4c8d0
GM
2116that change the size of windows and low-level functions that access
2117window size. Emacs does not permit overlapping windows or gaps between
0273ca3a 2118windows, so resizing a window always affects at least one other window.
b8d4c8d0
GM
2119
2120@deffn Command enlarge-window size &optional horizontal
0273ca3a
MR
2121This function makes the selected window @var{size} lines taller by
2122stealing lines from windows above or below. In a first round, it takes
2123lines from one window at a time until that window is
2124@code{window-min-height} lines tall, then takes from another. If, at
2125the end of the first round, the selected window is still not tall
2126enough, @code{enlarge-window} starts a second round, where it deletes
2127windows above or below the selected one.
b8d4c8d0 2128
5d8dda33
MR
2129If @var{horizontal} is non-@code{nil}, this function makes the window
2130@var{size} columns wider, stealing columns instead of lines. If a
2131window from which columns are stolen shrinks below
b8d4c8d0
GM
2132@code{window-min-width} columns, that window disappears.
2133
2134If the requested size would exceed that of the window's frame, then the
2135function makes the window occupy the entire height (or width) of the
2136frame.
2137
2138If there are various other windows from which lines or columns can be
2139stolen, and some of them specify fixed size (using
2140@code{window-size-fixed}, see below), they are left untouched while
a1401ab1 2141other windows are ``robbed.'' If it would be necessary to alter the
b8d4c8d0
GM
2142size of a fixed-size window, @code{enlarge-window} gets an error
2143instead.
2144
10e187e8 2145If @var{size} is negative, this function shrinks the selected window by
b8d4c8d0
GM
2146@minus{}@var{size} lines or columns. If that makes the window smaller
2147than the minimum size (@code{window-min-height} and
0273ca3a 2148@code{window-min-width}), then @code{enlarge-window} deletes the window.
b8d4c8d0
GM
2149
2150@code{enlarge-window} returns @code{nil}.
2151@end deffn
2152
2153@deffn Command enlarge-window-horizontally columns
2154This function makes the selected window @var{columns} wider.
2155It could be defined as follows:
2156
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
2165
2166@deffn Command shrink-window size &optional horizontal
2167This function is like @code{enlarge-window} but negates the argument
2168@var{size}, making the selected window smaller by giving lines (or
2169columns) to the other windows. If the window shrinks below
2170@code{window-min-height} or @code{window-min-width}, then it disappears.
2171
2172If @var{size} is negative, the window is enlarged by @minus{}@var{size}
2173lines or columns.
2174@end deffn
2175
2176@deffn Command shrink-window-horizontally columns
2177This function makes the selected window @var{columns} narrower.
2178It could be defined as follows:
2179
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
2188
2189@defun adjust-window-trailing-edge window delta horizontal
2190This function makes the selected window @var{delta} lines taller or
2191@var{delta} columns wider, by moving the bottom or right edge. This
2192function does not delete other windows; if it cannot make the
2193requested size adjustment, it signals an error. On success, this
2194function returns @code{nil}.
2195@end defun
2196
df006536
MR
2197@deffn Command fit-window-to-buffer &optional window max-height min-height
2198This command makes @var{window} the right height to display its
dda87836
MR
2199contents exactly. The default for @var{window} is the selected window.
2200
2201The optional argument @var{max-height} specifies the maximum height the
2202window is allowed to be; @code{nil} means use the maximum permissible
2203height of a window on @var{window}'s frame. The optional argument
2204@var{min-height} specifies the minimum height for the window; @code{nil}
2205means use @code{window-min-height}. All these height values include the
2206mode line and/or header line.
2207
2208This 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.
df006536 2211@end deffn
b8d4c8d0
GM
2212
2213@deffn Command shrink-window-if-larger-than-buffer &optional window
0273ca3a
MR
2214This command shrinks @var{window} vertically to be as small as possible
2215while still showing the full contents of its buffer---but not less than
aeeedf76
MR
2216@code{window-min-height} lines. The default for @var{window} is
2217the selected window.
b8d4c8d0 2218
0273ca3a 2219However, this command does nothing if the window is already too small to
b8d4c8d0
GM
2220display the whole text of the buffer, or if part of the contents are
2221currently scrolled off screen, or if the window is not the full width of
2222its frame, or if the window is the only window in its frame.
2223
2224This command returns non-@code{nil} if it actually shrank the window
2225and @code{nil} otherwise.
2226@end deffn
2227
52a94b85 2228@cindex fixed-size window
b8d4c8d0 2229@defvar window-size-fixed
0273ca3a
MR
2230If this variable is non-@code{nil}, in a given buffer, then the size of
2231any window displaying that buffer remains fixed unless you either
2232explicitly change it or Emacs has no other choice.
b8d4c8d0
GM
2233
2234If the value is @code{height}, then only the window's height is fixed;
2235if the value is @code{width}, then only the window's width is fixed.
2236Any other non-@code{nil} value fixes both the width and the height.
2237
2238This variable automatically becomes buffer-local when set.
2239
2240Explicit size-change functions such as @code{enlarge-window}
2241get an error if they would have to change a window size which is fixed.
2242Therefore, when you want to change the size of such a window,
2243you should bind @code{window-size-fixed} to @code{nil}, like this:
2244
2245@example
2246(let ((window-size-fixed nil))
2247 (enlarge-window 10))
2248@end example
2249
0273ca3a
MR
2250Deleting an adjacent window or changing the frame size may change the
2251size of a fixed-size window, if there is no other alternative.
b8d4c8d0
GM
2252@end defvar
2253
2254@cindex minimum window size
2255 The following two variables constrain the window-structure-changing
2256functions to a minimum height and width.
2257
2258@defopt window-min-height
403b14d1 2259The value of this variable specifies how short a window may become
b8d4c8d0 2260before it is automatically deleted. Making a window smaller than
5d8dda33
MR
2261@code{window-min-height} automatically deletes it, and no window may be
2262created shorter than this. The value is measured in line units. When
0273ca3a 2263the window wants a mode line and/or a header line, they are counted as
aeeedf76
MR
2264one line each. The default value is @code{4}. A value less than
2265@code{1} is ignored.
b8d4c8d0
GM
2266@end defopt
2267
2268@defopt window-min-width
403b14d1 2269The value of this variable specifies how narrow a window may become
b8d4c8d0
GM
2270before it is automatically deleted. Making a window smaller than
2271@code{window-min-width} automatically deletes it, and no window may be
5d8dda33 2272created narrower than this. The value is measured in characters and
0273ca3a
MR
2273includes any fringes or the scroll bar. The default value is @code{10}.
2274A value less than @code{2} is ignored.
b8d4c8d0
GM
2275@end defopt
2276
0273ca3a 2277@cindex balancing window sizes
a1401ab1 2278Emacs provides two functions to balance windows, that is, to even out
0273ca3a
MR
2279the sizes of windows on the same frame. The minibuffer window and
2280fixed-size windows are not resized by these functions.
2281
2282@deffn Command balance-windows &optional window-or-frame
2283This function balances windows in a way that gives more space to
2284full-width and/or full-height windows. If @var{window-or-frame}
2285specifies a frame, it balances all windows on that frame. If
2286@var{window-or-frame} specifies a window, it balances this window and
2287its ``siblings'' only. Think of a sibling as the other (original or
2288new) window with respect to the present one, involved in the process of
47264a97 2289splitting; see @ref{Splitting Windows}. Since a sibling may have been
0273ca3a
MR
2290split again, a window can have more than one sibling.
2291@end deffn
2292
2293@deffn Command balance-windows-area
2294This function attempts to give all windows on the selected frame
a1401ab1 2295approximately the same share of the screen area. This means that
0273ca3a
MR
2296full-width or full-height windows are not given more space than other
2297windows.
2298@end deffn
2299
b8d4c8d0
GM
2300@node Coordinates and Windows
2301@section Coordinates and Windows
2302
2303This section describes how to relate screen coordinates to windows.
2304
2305@defun window-at x y &optional frame
2306This function returns the window containing the specified cursor
2307position in the frame @var{frame}. The coordinates @var{x} and @var{y}
2308are measured in characters and count from the top left corner of the
2309frame. If they are out of range, @code{window-at} returns @code{nil}.
2310
2311If you omit @var{frame}, the selected frame is used.
2312@end defun
2313
2314@defun coordinates-in-window-p coordinates window
2315This function checks whether a particular frame position falls within
2316the window @var{window}.
2317
2318The 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
2320characters, and count from the top left corner of the screen or frame.
2321
2322The value returned by @code{coordinates-in-window-p} is non-@code{nil}
2323if the coordinates are inside @var{window}. The value also indicates
2324what part of the window the position is in, as follows:
2325
2326@table @code
2327@item (@var{relx} . @var{rely})
2328The coordinates are inside @var{window}. The numbers @var{relx} and
2329@var{rely} are the equivalent window-relative coordinates for the
2330specified position, counting from 0 at the top left corner of the
2331window.
2332
2333@item mode-line
2334The coordinates are in the mode line of @var{window}.
2335
2336@item header-line
2337The coordinates are in the header line of @var{window}.
2338
2339@item vertical-line
2340The coordinates are in the vertical line between @var{window} and its
2341neighbor to the right. This value occurs only if the window doesn't
2342have a scroll bar; positions in a scroll bar are considered outside the
2343window for these purposes.
2344
2345@item left-fringe
2346@itemx right-fringe
2347The coordinates are in the left or right fringe of the window.
2348
2349@item left-margin
2350@itemx right-margin
2351The coordinates are in the left or right margin of the window.
2352
2353@item nil
2354The coordinates are not in any part of @var{window}.
2355@end table
2356
2357The function @code{coordinates-in-window-p} does not require a frame as
2358argument because it always uses the frame that @var{window} is on.
2359@end defun
2360
2361@node Window Tree
2362@section The Window Tree
2363@cindex window tree
2364
2365 A @dfn{window tree} specifies the layout, size, and relationship
2366between all windows in one frame.
2367
2368@defun window-tree &optional frame
2369This function returns the window tree for frame @var{frame}.
2370If @var{frame} is omitted, the selected frame is used.
2371
2372The return value is a list of the form @code{(@var{root} @var{mini})},
2373where @var{root} represents the window tree of the frame's
2374root window, and @var{mini} is the frame's minibuffer window.
2375
2376If the root window is not split, @var{root} is the root window itself.
2377Otherwise, @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,
2379and @code{t} for a vertical split, @var{edges} gives the combined size and
2380position of the subwindows in the split, and the rest of the elements
2381are the subwindows in the split. Each of the subwindows may again be
2382a 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})}
2384similar to the value returned by @code{window-edges}.
2385@end defun
2386
2387@node Window Configurations
2388@section Window Configurations
2389@cindex window configurations
2390@cindex saving window information
2391
2392 A @dfn{window configuration} records the entire layout of one
0273ca3a
MR
2393frame---all windows, their sizes, which buffers they contain, how those
2394buffers are scrolled, and their values of point and the mark; also their
2395fringes, margins, and scroll bar settings. It also includes the value
2396of @code{minibuffer-scroll-window}. As a special exception, the window
2397configuration does not record the value of point in the selected window
2398for the current buffer. Also, the window configuration does not record
47264a97 2399the values of window parameters; see @ref{Window Parameters}.
0273ca3a 2400
a1401ab1
EZ
2401 You can bring back an entire frame layout by restoring a previously
2402saved window configuration. If you want to record the layout of all
0273ca3a 2403frames instead of just one, use a frame configuration instead of a
47264a97 2404window configuration; see @ref{Frame Configurations}.
b8d4c8d0
GM
2405
2406@defun current-window-configuration &optional frame
2407This function returns a new object representing @var{frame}'s current
aeeedf76
MR
2408window configuration. The default for @var{frame} is the selected
2409frame.
b8d4c8d0
GM
2410@end defun
2411
2412@defun set-window-configuration configuration
2413This function restores the configuration of windows and buffers as
2414specified by @var{configuration}, for the frame that @var{configuration}
2415was created for.
2416
2417The argument @var{configuration} must be a value that was previously
0273ca3a 2418returned by @code{current-window-configuration}. The configuration is
b8d4c8d0
GM
2419restored in the frame from which @var{configuration} was made, whether
2420that frame is selected or not. This always counts as a window size
2421change and triggers execution of the @code{window-size-change-functions}
2422(@pxref{Window Hooks}), because @code{set-window-configuration} doesn't
2423know how to tell whether the new configuration actually differs from the
2424old one.
2425
2426If the frame which @var{configuration} was saved from is dead, all this
2427function does is restore the three variables @code{window-min-height},
2428@code{window-min-width} and @code{minibuffer-scroll-window}. In this
2429case, the function returns @code{nil}. Otherwise, it returns @code{t}.
2430
2431Here is a way of using this function to get the same effect
2432as @code{save-window-excursion}:
2433
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
2444
2445@defspec save-window-excursion forms@dots{}
2446This special form records the window configuration, executes @var{forms}
2447in sequence, then restores the earlier window configuration. The window
2448configuration includes, for each window, the value of point and the
2449portion of the buffer that is visible. It also includes the choice of
2450selected window. However, it does not include the value of point in
2451the current buffer; use @code{save-excursion} also, if you wish to
2452preserve that.
2453
2454Don't use this construct when @code{save-selected-window} is sufficient.
2455
0273ca3a 2456Exit from @code{save-window-excursion} always triggers execution of
b8d4c8d0
GM
2457@code{window-size-change-functions}. (It doesn't know how to tell
2458whether the restored configuration actually differs from the one in
2459effect at the end of the @var{forms}.)
2460
2461The return value is the value of the final form in @var{forms}.
2462For example:
2463
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
2483
2484@defun window-configuration-p object
2485This function returns @code{t} if @var{object} is a window configuration.
2486@end defun
2487
2488@defun compare-window-configurations config1 config2
2489This function compares two window configurations as regards the
2490structure of windows, but ignores the values of point and mark and the
2491saved scrolling positions---it can return @code{t} even if those
2492aspects differ.
2493
2494The function @code{equal} can also compare two window configurations; it
2495regards configurations as unequal if they differ in any respect, even a
2496saved point or mark.
2497@end defun
2498
2499@defun window-configuration-frame config
2500This function returns the frame for which the window configuration
2501@var{config} was made.
2502@end defun
2503
2504 Other primitives to look inside of window configurations would make
2505sense, but are not implemented because we did not need them. See the
2506file @file{winner.el} for some more operations on windows
2507configurations.
2508
0273ca3a
MR
2509@node Window Parameters
2510@section Window Parameters
2511@cindex window parameters
2512
2513This sections describes how window parameters can be used to associate
2514additional information with windows.
2515
2516@defun window-parameter window parameter
aeeedf76
MR
2517This function returns @var{window}'s value for @var{parameter}. The
2518default for @var{window} is the selected window. If @var{window}
2519has no setting for @var{parameter}, this function returns @code{nil}.
0273ca3a
MR
2520@end defun
2521
a1401ab1 2522@defun window-parameters &optional window
0273ca3a 2523This function returns all parameters of @var{window} and their values.
aeeedf76
MR
2524The default for @var{window} is the selected window. The return value
2525is an association list of elements of the form @code{(@var{parameter}
a1401ab1 2526. @var{value})}.
0273ca3a
MR
2527@end defun
2528
2529@defun set-window-parameter window parameter value
2530This function sets @var{window}'s value of @var{parameter} to
aeeedf76
MR
2531@var{value} and returns @var{value}. The default for @var{window}
2532is the selected window.
0273ca3a
MR
2533@end defun
2534
2535Currently, window parameters are not saved in window configurations and
2536consequently not restored by @code{set-window-configuration}. Hence,
2537any change of a parameter introduced via @code{set-window-parameter} can
2538be undone only by invoking @code{set-window-parameter} for the same
2539parameter again. Since @code{save-window-excursion} relies on window
a1401ab1
EZ
2540configurations (@pxref{Window Configurations}), window parameters are
2541not saved and restored by that special form, either.
0273ca3a 2542
b8d4c8d0
GM
2543@node Window Hooks
2544@section Hooks for Window Scrolling and Changes
2545@cindex hooks for window operations
2546
2547This section describes how a Lisp program can take action whenever a
2548window displays a different part of its buffer or a different buffer.
2549There are three actions that can change this: scrolling the window,
2550switching buffers in the window, and changing the size of the window.
2551The first two actions run @code{window-scroll-functions}; the last runs
2552@code{window-size-change-functions}.
2553
2554@defvar window-scroll-functions
2555This variable holds a list of functions that Emacs should call before
0273ca3a
MR
2556redisplaying a window with scrolling. Displaying a different buffer in
2557the window also runs these functions.
b8d4c8d0 2558
0273ca3a
MR
2559This variable is not a normal hook, because each function is called with
2560two arguments: the window, and its new display-start position.
b8d4c8d0
GM
2561
2562These functions must be careful in using @code{window-end}
0273ca3a
MR
2563(@pxref{Window Start and End}); if you need an up-to-date value, you
2564must use the @var{update} argument to ensure you get it.
b8d4c8d0
GM
2565
2566@strong{Warning:} don't use this feature to alter the way the window
2567is scrolled. It's not designed for that, and such use probably won't
2568work.
2569@end defvar
2570
2571@defvar window-size-change-functions
2572This variable holds a list of functions to be called if the size of any
2573window changes for any reason. The functions are called just once per
2574redisplay, and just once for each frame on which size changes have
2575occurred.
2576
2577Each function receives the frame as its sole argument. There is no
2578direct way to find out which windows on that frame have changed size, or
2579precisely how. However, if a size-change function records, at each
2580call, the existing windows and their sizes, it can also compare the
2581present sizes and the previous sizes.
2582
2583Creating or deleting windows counts as a size change, and therefore
2584causes these functions to be called. Changing the frame size also
2585counts, because it changes the sizes of the existing windows.
2586
2587It is not a good idea to use @code{save-window-excursion} (@pxref{Window
2588Configurations}) in these functions, because that always counts as a
2589size change, and it would cause these functions to be called over and
2590over. In most cases, @code{save-selected-window} (@pxref{Selecting
2591Windows}) is what you need here.
2592@end defvar
2593
b8d4c8d0
GM
2594@defvar window-configuration-change-hook
2595A normal hook that is run every time you change the window configuration
2596of an existing frame. This includes splitting or deleting windows,
2597changing the sizes of windows, or displaying a different buffer in a
0273ca3a
MR
2598window.
2599
2600The buffer-local part of this hook is run once per each window on the
2601affected frame, with the relevant window selected and its buffer
2602current. The global part is run once for the modified frame, with that
2603frame selected.
b8d4c8d0
GM
2604@end defvar
2605
38b1d346 2606 In addition, you can use @code{jit-lock-register} to register a Font
b8766179
MR
2607Lock fontification function, which will be called whenever parts of a
2608buffer are (re)fontified because a window was scrolled or its size
2609changed. @xref{Other Font Lock Variables}.
38b1d346 2610
b8d4c8d0
GM
2611@ignore
2612 arch-tag: 3f6c36e8-df49-4986-b757-417feed88be3
2613@end ignore