(decode_coding_emacs_mule): Fix the case of
[bpt/emacs.git] / lispref / windows.texi
CommitLineData
b1b12a8e
RS
1@c -*-texinfo-*-
2@c This is part of the GNU Emacs Lisp Reference Manual.
fd897522
GM
3@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999
4@c Free Software Foundation, Inc.
b1b12a8e
RS
5@c See the file elisp.texi for copying conditions.
6@setfilename ../info/windows
7@node Windows, Frames, Buffers, Top
8@chapter Windows
9
10 This chapter describes most of the functions and variables related to
11Emacs windows. See @ref{Display}, for information on how text is
12displayed in windows.
13
14@menu
3c29caa8
DH
15* Basic Windows:: Basic information on using windows.
16* Splitting Windows:: Splitting one window into two windows.
17* Deleting Windows:: Deleting a window gives its space to other windows.
18* Selecting Windows:: The selected window is the one that you edit in.
19* Cyclic Window Ordering:: Moving around the existing windows.
20* Buffers and Windows:: Each window displays the contents of a buffer.
21* Displaying Buffers:: Higher-lever functions for displaying a buffer
22 and choosing a window for it.
23* Choosing Window:: How to choose a window for displaying a buffer.
24* Window Point:: Each window has its own location of point.
25* Window Start:: The display-start position controls which text
26 is on-screen in the window.
8241495d
RS
27* Textual Scrolling:: Moving text up and down through the window.
28* Vertical Scrolling:: Moving the contents up and down on the window.
29* Horizontal Scrolling:: Moving the contents sideways on the window.
3c29caa8
DH
30* Size of Window:: Accessing the size of a window.
31* Resizing Windows:: Changing the size of a window.
32* Coordinates and Windows:: Converting coordinates to windows.
33* Window Configurations:: Saving and restoring the state of the screen.
f9f59935
RS
34* Window Hooks:: Hooks for scrolling, window size changes,
35 redisplay going past a certain point,
36 or window configuration changes.
b1b12a8e
RS
37@end menu
38
39@node Basic Windows
40@section Basic Concepts of Emacs Windows
41@cindex window
42@cindex selected window
43
bfe721d1
KH
44 A @dfn{window} in Emacs is the physical area of the screen in which a
45buffer is displayed. The term is also used to refer to a Lisp object that
b1b12a8e
RS
46represents that screen area in Emacs Lisp. It should be
47clear from the context which is meant.
48
bfe721d1
KH
49 Emacs groups windows into frames. A frame represents an area of
50screen available for Emacs to use. Each frame always contains at least
51one window, but you can subdivide it vertically or horizontally into
52multiple nonoverlapping Emacs windows.
53
54 In each frame, at any time, one and only one window is designated as
55@dfn{selected within the frame}. The frame's cursor appears in that
f9f59935 56window. At any time, one frame is the selected frame; and the window
bfe721d1
KH
57selected within that frame is @dfn{the selected window}. The selected
58window's buffer is usually the current buffer (except when
59@code{set-buffer} has been used). @xref{Current Buffer}.
60
61 For practical purposes, a window exists only while it is displayed in
62a frame. Once removed from the frame, the window is effectively deleted
63and should not be used, @emph{even though there may still be references
64to it} from other Lisp objects. Restoring a saved window configuration
65is the only way for a window no longer on the screen to come back to
66life. (@xref{Deleting Windows}.)
b1b12a8e
RS
67
68 Each window has the following attributes:
69
70@itemize @bullet
71@item
72containing frame
73
3c29caa8 74@item
b1b12a8e
RS
75window height
76
3c29caa8 77@item
b1b12a8e
RS
78window width
79
3c29caa8 80@item
b1b12a8e
RS
81window edges with respect to the screen or frame
82
3c29caa8 83@item
b1b12a8e
RS
84the buffer it displays
85
3c29caa8 86@item
b1b12a8e
RS
87position within the buffer at the upper left of the window
88
3c29caa8 89@item
c638661f 90amount of horizontal scrolling, in columns
b1b12a8e 91
3c29caa8 92@item
b1b12a8e
RS
93point
94
3c29caa8 95@item
b1b12a8e
RS
96the mark
97
3c29caa8 98@item
b1b12a8e
RS
99how recently the window was selected
100@end itemize
101
102@cindex multiple windows
103 Users create multiple windows so they can look at several buffers at
104once. Lisp libraries use multiple windows for a variety of reasons, but
bfe721d1
KH
105most often to display related information. In Rmail, for example, you
106can move through a summary buffer in one window while the other window
107shows messages one at a time as they are reached.
b1b12a8e
RS
108
109 The meaning of ``window'' in Emacs is similar to what it means in the
c638661f 110context of general-purpose window systems such as X, but not identical.
bfe721d1
KH
111The X Window System places X windows on the screen; Emacs uses one or
112more X windows as frames, and subdivides them into
113Emacs windows. When you use Emacs on a character-only terminal, Emacs
114treats the whole terminal screen as one frame.
b1b12a8e
RS
115
116@cindex terminal screen
117@cindex screen of terminal
118@cindex tiled windows
119 Most window systems support arbitrarily located overlapping windows.
120In contrast, Emacs windows are @dfn{tiled}; they never overlap, and
f9f59935
RS
121together they fill the whole screen or frame. Because of the way in
122which Emacs creates new windows and resizes them, not all conceivable
123tilings of windows on an Emacs frame are actually possible.
124@xref{Splitting Windows}, and @ref{Size of Window}.
b1b12a8e
RS
125
126 @xref{Display}, for information on how the contents of the
127window's buffer are displayed in the window.
128
129@defun windowp object
f9f59935 130This function returns @code{t} if @var{object} is a window.
b1b12a8e
RS
131@end defun
132
133@node Splitting Windows
134@section Splitting Windows
135@cindex splitting windows
136@cindex window splitting
137
138 The functions described here are the primitives used to split a window
139into two windows. Two higher level functions sometimes split a window,
140but not always: @code{pop-to-buffer} and @code{display-buffer}
141(@pxref{Displaying Buffers}).
142
143 The functions described here do not accept a buffer as an argument.
144The two ``halves'' of the split window initially display the same buffer
145previously visible in the window that was split.
146
147@deffn Command split-window &optional window size horizontal
148This function splits @var{window} into two windows. The original
149window @var{window} remains the selected window, but occupies only
150part of its former screen area. The rest is occupied by a newly created
151window which is returned as the value of this function.
152
153 If @var{horizontal} is non-@code{nil}, then @var{window} splits into
154two side by side windows. The original window @var{window} keeps the
155leftmost @var{size} columns, and gives the rest of the columns to the
156new window. Otherwise, it splits into windows one above the other, and
157@var{window} keeps the upper @var{size} lines and gives the rest of the
158lines to the new window. The original window is therefore the
c638661f 159left-hand or upper of the two, and the new window is the right-hand or
b1b12a8e
RS
160lower.
161
162 If @var{window} is omitted or @code{nil}, then the selected window is
163split. If @var{size} is omitted or @code{nil}, then @var{window} is
164divided evenly into two parts. (If there is an odd line, it is
165allocated to the new window.) When @code{split-window} is called
166interactively, all its arguments are @code{nil}.
167
168 The following example starts with one window on a screen that is 50
169lines high by 80 columns wide; then the window is split.
170
171@smallexample
172@group
173(setq w (selected-window))
174 @result{} #<window 8 on windows.texi>
175(window-edges) ; @r{Edges in order:}
176 @result{} (0 0 80 50) ; @r{left--top--right--bottom}
177@end group
178
179@group
180;; @r{Returns window created}
3c29caa8 181(setq w2 (split-window w 15))
b1b12a8e
RS
182 @result{} #<window 28 on windows.texi>
183@end group
184@group
185(window-edges w2)
186 @result{} (0 15 80 50) ; @r{Bottom window;}
187 ; @r{top is line 15}
188@end group
189@group
190(window-edges w)
191 @result{} (0 0 80 15) ; @r{Top window}
192@end group
193@end smallexample
194
195The screen looks like this:
196
197@smallexample
198@group
3c29caa8
DH
199 __________
200 | | line 0
b1b12a8e
RS
201 | w |
202 |__________|
203 | | line 15
204 | w2 |
205 |__________|
206 line 50
207 column 0 column 80
208@end group
209@end smallexample
210
211Next, the top window is split horizontally:
212
213@smallexample
214@group
215(setq w3 (split-window w 35 t))
216 @result{} #<window 32 on windows.texi>
217@end group
218@group
219(window-edges w3)
220 @result{} (35 0 80 15) ; @r{Left edge at column 35}
221@end group
222@group
223(window-edges w)
224 @result{} (0 0 35 15) ; @r{Right edge at column 35}
225@end group
226@group
227(window-edges w2)
228 @result{} (0 15 80 50) ; @r{Bottom window unchanged}
229@end group
230@end smallexample
231
bda144f4 232@need 3000
b1b12a8e
RS
233Now, the screen looks like this:
234
235@smallexample
236@group
237 column 35
3c29caa8
DH
238 __________
239 | | | line 0
b1b12a8e
RS
240 | w | w3 |
241 |___|______|
242 | | line 15
243 | w2 |
244 |__________|
245 line 50
246 column 0 column 80
247@end group
248@end smallexample
aeb2c306
JB
249
250Normally, Emacs indicates the border between two side-by-side windows
969fe9b5 251with a scroll bar (@pxref{Window Frame Parameters,Scroll Bars}) or @samp{|}
aeb2c306
JB
252characters. The display table can specify alternative border
253characters; see @ref{Display Tables}.
b1b12a8e
RS
254@end deffn
255
8241495d 256@deffn Command split-window-vertically &optional size
1911e6e5 257This function splits the selected window into two windows, one above the
ebc6903b 258other, leaving the upper of the two windows selected, with @var{size}
1911e6e5
RS
259lines. (If @var{size} is negative, then the lower of the two windows
260gets @minus{} @var{size} lines and the upper window gets the rest, but
261the upper window is still the one selected.)
b1b12a8e
RS
262@end deffn
263
2468d0c0 264@deffn Command split-window-horizontally &optional size
b1b12a8e
RS
265This function splits the selected window into two windows
266side-by-side, leaving the selected window with @var{size} columns.
267
8241495d
RS
268This function is basically an interface to @code{split-window}.
269You could define a simplified version of the function like this:
b1b12a8e
RS
270
271@smallexample
272@group
273(defun split-window-horizontally (&optional arg)
274 "Split selected window into two windows, side by side..."
275 (interactive "P")
513331d3 276@end group
8241495d
RS
277@group
278 (let ((size (and arg (prefix-numeric-value arg))))
279 (and size (< size 0)
280 (setq size (+ (window-width) size)))
281 (split-window nil size t)))
b1b12a8e
RS
282@end group
283@end smallexample
284@end deffn
285
286@defun one-window-p &optional no-mini all-frames
287This function returns non-@code{nil} if there is only one window. The
288argument @var{no-mini}, if non-@code{nil}, means don't count the
289minibuffer even if it is active; otherwise, the minibuffer window is
eaac2be1 290included, if active, in the total number of windows, which is compared
b1b12a8e
RS
291against one.
292
293The argument @var{all-frames} specifies which frames to consider. Here
294are the possible values and their meanings:
295
296@table @asis
297@item @code{nil}
298Count the windows in the selected frame, plus the minibuffer used
299by that frame even if it lies in some other frame.
300
301@item @code{t}
302Count all windows in all existing frames.
303
304@item @code{visible}
305Count all windows in all visible frames.
306
bfe721d1
KH
307@item 0
308Count all windows in all visible or iconified frames.
309
b1b12a8e
RS
310@item anything else
311Count precisely the windows in the selected frame, and no others.
312@end table
313@end defun
314
315@node Deleting Windows
316@section Deleting Windows
317@cindex deleting windows
318
319A window remains visible on its frame unless you @dfn{delete} it by
320calling certain functions that delete windows. A deleted window cannot
321appear on the screen, but continues to exist as a Lisp object until
322there are no references to it. There is no way to cancel the deletion
323of a window aside from restoring a saved window configuration
324(@pxref{Window Configurations}). Restoring a window configuration also
325deletes any windows that aren't part of that configuration.
326
327 When you delete a window, the space it took up is given to one
969fe9b5 328adjacent sibling.
b1b12a8e
RS
329
330@c Emacs 19 feature
331@defun window-live-p window
332This function returns @code{nil} if @var{window} is deleted, and
333@code{t} otherwise.
334
b22f3a19 335@strong{Warning:} Erroneous information or fatal errors may result from
b1b12a8e
RS
336using a deleted window as if it were live.
337@end defun
338
339@deffn Command delete-window &optional window
969fe9b5
RS
340This function removes @var{window} from display, and returns @code{nil}.
341If @var{window} is omitted, then the selected window is deleted. An
342error is signaled if there is only one window when @code{delete-window}
343is called.
b1b12a8e
RS
344@end deffn
345
346@deffn Command delete-other-windows &optional window
347This function makes @var{window} the only window on its frame, by
348deleting the other windows in that frame. If @var{window} is omitted or
349@code{nil}, then the selected window is used by default.
350
969fe9b5 351The return value is @code{nil}.
b1b12a8e
RS
352@end deffn
353
354@deffn Command delete-windows-on buffer &optional frame
355This function deletes all windows showing @var{buffer}. If there are
356no windows showing @var{buffer}, it does nothing.
357
358@code{delete-windows-on} operates frame by frame. If a frame has
359several windows showing different buffers, then those showing
360@var{buffer} are removed, and the others expand to fill the space. If
361all windows in some frame are showing @var{buffer} (including the case
362where there is only one window), then the frame reverts to having a
363single window showing another buffer chosen with @code{other-buffer}.
364@xref{The Buffer List}.
365
1911e6e5
RS
366The argument @var{frame} controls which frames to operate on. This
367function does not use it in quite the same way as the other functions
368which scan all windows; specifically, the values @code{t} and @code{nil}
369have the opposite of their meanings in other functions. Here are the
370full details:
b1b12a8e
RS
371
372@itemize @bullet
373@item
1911e6e5 374If it is @code{nil}, operate on all frames.
b1b12a8e 375@item
1911e6e5 376If it is @code{t}, operate on the selected frame.
b1b12a8e
RS
377@item
378If it is @code{visible}, operate on all visible frames.
1911e6e5 379@item
bfe721d1 380If it is 0, operate on all visible or iconified frames.
b1b12a8e
RS
381@item
382If it is a frame, operate on that frame.
383@end itemize
384
385This function always returns @code{nil}.
386@end deffn
387
388@node Selecting Windows
389@section Selecting Windows
390@cindex selecting windows
391
392 When a window is selected, the buffer in the window becomes the current
393buffer, and the cursor will appear in it.
394
395@defun selected-window
396This function returns the selected window. This is the window in
397which the cursor appears and to which many commands apply.
398@end defun
399
400@defun select-window window
401This function makes @var{window} the selected window. The cursor then
402appears in @var{window} (on redisplay). The buffer being displayed in
403@var{window} is immediately designated the current buffer.
404
405The return value is @var{window}.
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
bfe721d1
KH
416@defmac save-selected-window forms@dots{}
417This macro records the selected window, executes @var{forms}
418in sequence, then restores the earlier selected window.
3c29caa8
DH
419
420This macro does not save or restore anything about the sizes, arrangement
bfe721d1 421or contents of windows; therefore, if the @var{forms} change them,
3c29caa8
DH
422the change persists.
423
424Each frame, at any time, has a window selected within the frame. This
969fe9b5 425macro saves only @emph{the} selected window; it does not save anything
3c29caa8
DH
426about other frames. If the @var{forms} select some other frame and
427alter the window selected within it, the change persists.
bfe721d1
KH
428@end defmac
429
b1b12a8e
RS
430@cindex finding windows
431 The following functions choose one of the windows on the screen,
432offering various criteria for the choice.
433
434@defun get-lru-window &optional frame
435This function returns the window least recently ``used'' (that is,
436selected). The selected window is always the most recently used window.
437
438The selected window can be the least recently used window if it is the
439only window. A newly created window becomes the least recently used
440window until it is selected. A minibuffer window is never a candidate.
441
c638661f 442The argument @var{frame} controls which windows are considered.
b1b12a8e
RS
443
444@itemize @bullet
445@item
446If it is @code{nil}, consider windows on the selected frame.
447@item
448If it is @code{t}, consider windows on all frames.
449@item
450If it is @code{visible}, consider windows on all visible frames.
451@item
bfe721d1
KH
452If it is 0, consider windows on all visible or iconified frames.
453@item
b1b12a8e
RS
454If it is a frame, consider windows on that frame.
455@end itemize
456@end defun
457
458@defun get-largest-window &optional frame
459This function returns the window with the largest area (height times
460width). If there are no side-by-side windows, then this is the window
461with the most lines. A minibuffer window is never a candidate.
462
463If there are two windows of the same size, then the function returns
c638661f 464the window that is first in the cyclic ordering of windows (see
b1b12a8e
RS
465following section), starting from the selected window.
466
1911e6e5
RS
467The argument @var{frame} controls which set of windows to
468consider. See @code{get-lru-window}, above.
b1b12a8e
RS
469@end defun
470
471@node Cyclic Window Ordering
472@comment node-name, next, previous, up
473@section Cyclic Ordering of Windows
474@cindex cyclic ordering of windows
475@cindex ordering of windows, cyclic
3c29caa8 476@cindex window ordering, cyclic
b1b12a8e
RS
477
478 When you use the command @kbd{C-x o} (@code{other-window}) to select
479the next window, it moves through all the windows on the screen in a
480specific cyclic order. For any given configuration of windows, this
481order never varies. It is called the @dfn{cyclic ordering of windows}.
482
483 This ordering generally goes from top to bottom, and from left to
484right. But it may go down first or go right first, depending on the
485order in which the windows were split.
486
487 If the first split was vertical (into windows one above each other),
488and then the subwindows were split horizontally, then the ordering is
489left to right in the top of the frame, and then left to right in the
490next lower part of the frame, and so on. If the first split was
491horizontal, the ordering is top to bottom in the left part, and so on.
492In general, within each set of siblings at any level in the window tree,
493the order is left to right, or top to bottom.
494
495@defun next-window &optional window minibuf all-frames
496@cindex minibuffer window
497This function returns the window following @var{window} in the cyclic
c638661f
RS
498ordering of windows. This is the window that @kbd{C-x o} would select
499if typed when @var{window} is selected. If @var{window} is the only
b1b12a8e
RS
500window visible, then this function returns @var{window}. If omitted,
501@var{window} defaults to the selected window.
502
503The value of the argument @var{minibuf} determines whether the
504minibuffer is included in the window order. Normally, when
505@var{minibuf} is @code{nil}, the minibuffer is included if it is
506currently active; this is the behavior of @kbd{C-x o}. (The minibuffer
507window is active while the minibuffer is in use. @xref{Minibuffers}.)
508
509If @var{minibuf} is @code{t}, then the cyclic ordering includes the
510minibuffer window even if it is not active.
511
512If @var{minibuf} is neither @code{t} nor @code{nil}, then the minibuffer
513window is not included even if it is active.
514
515The argument @var{all-frames} specifies which frames to consider. Here
516are the possible values and their meanings:
517
518@table @asis
519@item @code{nil}
520Consider all the windows in @var{window}'s frame, plus the minibuffer
521used by that frame even if it lies in some other frame.
522
523@item @code{t}
524Consider all windows in all existing frames.
525
526@item @code{visible}
527Consider all windows in all visible frames. (To get useful results, you
528must ensure @var{window} is in a visible frame.)
529
83abd543 530@item 0
bfe721d1
KH
531Consider all windows in all visible or iconified frames.
532
b1b12a8e
RS
533@item anything else
534Consider precisely the windows in @var{window}'s frame, and no others.
535@end table
536
3c29caa8 537This example assumes there are two windows, both displaying the
b1b12a8e
RS
538buffer @samp{windows.texi}:
539
540@example
541@group
542(selected-window)
543 @result{} #<window 56 on windows.texi>
544@end group
545@group
546(next-window (selected-window))
547 @result{} #<window 52 on windows.texi>
548@end group
549@group
550(next-window (next-window (selected-window)))
551 @result{} #<window 56 on windows.texi>
552@end group
553@end example
554@end defun
555
556@defun previous-window &optional window minibuf all-frames
557This function returns the window preceding @var{window} in the cyclic
558ordering of windows. The other arguments specify which windows to
559include in the cycle, as in @code{next-window}.
560@end defun
561
8241495d 562@deffn Command other-window count &optional all-frames
b1b12a8e 563This function selects the @var{count}th following window in the cyclic
969fe9b5
RS
564order. If count is negative, then it moves back @minus{}@var{count}
565windows in the cycle, rather than forward. It returns @code{nil}.
b1b12a8e 566
75708135 567The argument @var{all-frames} has the same meaning as in
8241495d
RS
568@code{next-window}, but the @var{minibuf} argument of @code{next-window}
569is always effectively @code{nil}.
570
b1b12a8e
RS
571In an interactive call, @var{count} is the numeric prefix argument.
572@end deffn
573
574@c Emacs 19 feature
575@defun walk-windows proc &optional minibuf all-frames
576This function cycles through all windows, calling @code{proc}
577once for each window with the window as its sole argument.
578
579The optional arguments @var{minibuf} and @var{all-frames} specify the
580set of windows to include in the scan. See @code{next-window}, above,
581for details.
582@end defun
583
e258eedc
GM
584@defun window-list &optional frame minibuf window
585This function returns a list of the windows on @var{frame}, starting
586with @var{window}. If @var{frame} is @code{nil} or omitted, the
587selected frame is used instead; if @var{window} is @code{nil} or
588omitted, the selected window is used instead.
589
590The value of @var{minibuf} determines if the minibuffer window will be
591included in the result list. If @var{minibuf} is @code{t}, the
592minibuffer window will be included, even if it isn't active. If
429994d8 593@var{minibuf} is @code{nil} or omitted, the minibuffer window will
e258eedc
GM
594only be included in the list if it is active. If @var{minibuf} is
595neither @code{nil} nor @code{t}, the minibuffer window is not
596included, whether or not it is active.
429994d8 597@end defun
e258eedc 598
b1b12a8e
RS
599@node Buffers and Windows
600@section Buffers and Windows
601@cindex examining windows
602@cindex windows, controlling precisely
603@cindex buffers, controlled in windows
604
605 This section describes low-level functions to examine windows or to
606display buffers in windows in a precisely controlled fashion.
607@iftex
608See the following section for
609@end iftex
37680279 610@ifnottex
b1b12a8e 611@xref{Displaying Buffers}, for
37680279 612@end ifnottex
b1b12a8e
RS
613related functions that find a window to use and specify a buffer for it.
614The functions described there are easier to use than these, but they
615employ heuristics in choosing or creating a window; use these functions
616when you need complete control.
617
618@defun set-window-buffer window buffer-or-name
619This function makes @var{window} display @var{buffer-or-name} as its
a9f0a989
RS
620contents. It returns @code{nil}. This is the fundamental primitive
621for changing which buffer is displayed in a window, and all ways
622of doing that call this function.
b1b12a8e
RS
623
624@example
625@group
626(set-window-buffer (selected-window) "foo")
627 @result{} nil
628@end group
629@end example
630@end defun
631
632@defun window-buffer &optional window
633This function returns the buffer that @var{window} is displaying. If
634@var{window} is omitted, this function returns the buffer for the
635selected window.
636
637@example
638@group
639(window-buffer)
640 @result{} #<buffer windows.texi>
641@end group
642@end example
643@end defun
644
645@defun get-buffer-window buffer-or-name &optional all-frames
646This function returns a window currently displaying
647@var{buffer-or-name}, or @code{nil} if there is none. If there are
648several such windows, then the function returns the first one in the
649cyclic ordering of windows, starting from the selected window.
650@xref{Cyclic Window Ordering}.
651
652The argument @var{all-frames} controls which windows to consider.
653
654@itemize @bullet
655@item
656If it is @code{nil}, consider windows on the selected frame.
657@item
658If it is @code{t}, consider windows on all frames.
659@item
660If it is @code{visible}, consider windows on all visible frames.
661@item
bfe721d1
KH
662If it is 0, consider windows on all visible or iconified frames.
663@item
b1b12a8e
RS
664If it is a frame, consider windows on that frame.
665@end itemize
666@end defun
667
3c29caa8
DH
668@defun get-buffer-window-list buffer-or-name &optional minibuf all-frames
669This function returns a list of all the windows currently displaying
670@var{buffer-or-name}.
671
672The two optional arguments work like the optional arguments of
673@code{next-window} (@pxref{Cyclic Window Ordering}); they are @emph{not}
674like the single optional argument of @code{get-buffer-window}. Perhaps
675we should change @code{get-buffer-window} in the future to make it
676compatible with the other functions.
677
678The argument @var{all-frames} controls which windows to consider.
679
680@itemize @bullet
681@item
682If it is @code{nil}, consider windows on the selected frame.
683@item
684If it is @code{t}, consider windows on all frames.
685@item
686If it is @code{visible}, consider windows on all visible frames.
687@item
688If it is 0, consider windows on all visible or iconified frames.
689@item
690If it is a frame, consider windows on that frame.
691@end itemize
692@end defun
693
a9f0a989 694@defvar buffer-display-time
a9f0a989
RS
695This variable records the time at which a buffer was last made visible
696in a window. It is always local in each buffer; each time
697@code{set-window-buffer} is called, it sets this variable to
698@code{(current-time)} in the specified buffer (@pxref{Time of Day}).
1911e6e5 699When a buffer is first created, @code{buffer-display-time} starts out
a9f0a989
RS
700with the value @code{nil}.
701@end defvar
702
b1b12a8e
RS
703@node Displaying Buffers
704@section Displaying Buffers in Windows
705@cindex switching to a buffer
706@cindex displaying a buffer
707
708 In this section we describe convenient functions that choose a window
709automatically and use it to display a specified buffer. These functions
710can also split an existing window in certain circumstances. We also
711describe variables that parameterize the heuristics used for choosing a
712window.
713@iftex
714See the preceding section for
715@end iftex
37680279 716@ifnottex
b1b12a8e 717@xref{Buffers and Windows}, for
37680279 718@end ifnottex
a9f0a989
RS
719low-level functions that give you more precise control. All of these
720functions work by calling @code{set-window-buffer}.
b1b12a8e
RS
721
722 Do not use the functions in this section in order to make a buffer
723current so that a Lisp program can access or modify it; they are too
724drastic for that purpose, since they change the display of buffers in
969fe9b5 725windows, which would be gratuitous and surprise the user. Instead, use
1911e6e5
RS
726@code{set-buffer} and @code{save-current-buffer} (@pxref{Current
727Buffer}), which designate buffers as current for programmed access
728without affecting the display of buffers in windows.
b1b12a8e
RS
729
730@deffn Command switch-to-buffer buffer-or-name &optional norecord
731This function makes @var{buffer-or-name} the current buffer, and also
732displays the buffer in the selected window. This means that a human can
733see the buffer and subsequent keyboard commands will apply to it.
734Contrast this with @code{set-buffer}, which makes @var{buffer-or-name}
735the current buffer but does not display it in the selected window.
736@xref{Current Buffer}.
737
22697dac
KH
738If @var{buffer-or-name} does not identify an existing buffer, then a new
739buffer by that name is created. The major mode for the new buffer is
740set according to the variable @code{default-major-mode}. @xref{Auto
741Major Mode}.
b1b12a8e 742
969fe9b5
RS
743Normally the specified buffer is put at the front of the buffer list
744(both the selected frame's buffer list and the frame-independent buffer
745list). This affects the operation of @code{other-buffer}. However, if
b1b12a8e
RS
746@var{norecord} is non-@code{nil}, this is not done. @xref{The Buffer
747List}.
748
749The @code{switch-to-buffer} function is often used interactively, as
750the binding of @kbd{C-x b}. It is also used frequently in programs. It
751always returns @code{nil}.
752@end deffn
753
f9f59935 754@deffn Command switch-to-buffer-other-window buffer-or-name &optional norecord
b1b12a8e
RS
755This function makes @var{buffer-or-name} the current buffer and
756displays it in a window not currently selected. It then selects that
757window. The handling of the buffer is the same as in
758@code{switch-to-buffer}.
759
c638661f
RS
760The currently selected window is absolutely never used to do the job.
761If it is the only window, then it is split to make a distinct window for
762this purpose. If the selected window is already displaying the buffer,
763then it continues to do so, but another window is nonetheless found to
764display it in as well.
f9f59935
RS
765
766This function updates the buffer list just like @code{switch-to-buffer}
767unless @var{norecord} is non-@code{nil}.
b1b12a8e
RS
768@end deffn
769
f9f59935 770@defun pop-to-buffer buffer-or-name &optional other-window norecord
b1b12a8e
RS
771This function makes @var{buffer-or-name} the current buffer and
772switches to it in some window, preferably not the window previously
773selected. The ``popped-to'' window becomes the selected window within
774its frame.
775
776If the variable @code{pop-up-frames} is non-@code{nil},
777@code{pop-to-buffer} looks for a window in any visible frame already
778displaying the buffer; if there is one, it returns that window and makes
779it be selected within its frame. If there is none, it creates a new
780frame and displays the buffer in it.
781
782If @code{pop-up-frames} is @code{nil}, then @code{pop-to-buffer}
783operates entirely within the selected frame. (If the selected frame has
784just a minibuffer, @code{pop-to-buffer} operates within the most
785recently selected frame that was not just a minibuffer.)
786
787If the variable @code{pop-up-windows} is non-@code{nil}, windows may
788be split to create a new window that is different from the original
789window. For details, see @ref{Choosing Window}.
790
791If @var{other-window} is non-@code{nil}, @code{pop-to-buffer} finds or
792creates another window even if @var{buffer-or-name} is already visible
793in the selected window. Thus @var{buffer-or-name} could end up
794displayed in two windows. On the other hand, if @var{buffer-or-name} is
795already displayed in the selected window and @var{other-window} is
796@code{nil}, then the selected window is considered sufficient display
797for @var{buffer-or-name}, so that nothing needs to be done.
798
bfe721d1
KH
799All the variables that affect @code{display-buffer} affect
800@code{pop-to-buffer} as well. @xref{Choosing Window}.
801
b1b12a8e 802If @var{buffer-or-name} is a string that does not name an existing
22697dac
KH
803buffer, a buffer by that name is created. The major mode for the new
804buffer is set according to the variable @code{default-major-mode}.
805@xref{Auto Major Mode}.
f9f59935
RS
806
807This function updates the buffer list just like @code{switch-to-buffer}
808unless @var{norecord} is non-@code{nil}.
b1b12a8e
RS
809@end defun
810
bfe721d1
KH
811@deffn Command replace-buffer-in-windows buffer
812This function replaces @var{buffer} with some other buffer in all
813windows displaying it. The other buffer used is chosen with
814@code{other-buffer}. In the usual applications of this function, you
815don't care which other buffer is used; you just want to make sure that
816@var{buffer} is no longer displayed.
817
818This function returns @code{nil}.
819@end deffn
820
b1b12a8e
RS
821@node Choosing Window
822@section Choosing a Window for Display
823
c638661f 824 This section describes the basic facility that chooses a window to
b1b12a8e
RS
825display a buffer in---@code{display-buffer}. All the higher-level
826functions and commands use this subroutine. Here we describe how to use
827@code{display-buffer} and how to customize it.
828
f9f59935 829@deffn Command display-buffer buffer-or-name &optional not-this-window frame
b1b12a8e
RS
830This command makes @var{buffer-or-name} appear in some window, like
831@code{pop-to-buffer}, but it does not select that window and does not
832make the buffer current. The identity of the selected window is
833unaltered by this function.
834
835If @var{not-this-window} is non-@code{nil}, it means to display the
836specified buffer in a window other than the selected one, even if it is
837already on display in the selected window. This can cause the buffer to
838appear in two windows at once. Otherwise, if @var{buffer-or-name} is
839already being displayed in any window, that is good enough, so this
840function does nothing.
841
842@code{display-buffer} returns the window chosen to display
843@var{buffer-or-name}.
844
f9f59935 845If the argument @var{frame} is non-@code{nil}, it specifies which frames
1911e6e5
RS
846to check when deciding whether the buffer is already displayed. If the
847buffer is already displayed in some window on one of these frames,
848@code{display-buffer} simply returns that window. Here are the possible
849values of @var{frame}:
850
851@itemize @bullet
852@item
853If it is @code{nil}, consider windows on the selected frame.
854@item
855If it is @code{t}, consider windows on all frames.
856@item
857If it is @code{visible}, consider windows on all visible frames.
858@item
859If it is 0, consider windows on all visible or iconified frames.
860@item
861If it is a frame, consider windows on that frame.
862@end itemize
f9f59935 863
b1b12a8e
RS
864Precisely how @code{display-buffer} finds or creates a window depends on
865the variables described below.
866@end deffn
867
704bdba1
GM
868@defopt display-buffer-reuse-frames
869If this variable is non-@code{nil}, @code{display-buffer} searches
870existing frames for a window displaying the buffer. If the buffer is
871already displayed in a window in some frame, @code{display-buffer} makes
872the frame visible and raises it, to use that window. If the buffer is
873not already displayed, or if @code{display-buffer-reuse-frames} is
874@code{nil}, @code{display-buffer}'s behavior is determined by other
875variables, described below.
876@end defopt
877
b1b12a8e
RS
878@defopt pop-up-windows
879This variable controls whether @code{display-buffer} makes new windows.
880If it is non-@code{nil} and there is only one window, then that window
881is split. If it is @code{nil}, then @code{display-buffer} does not
882split the single window, but uses it whole.
883@end defopt
884
885@defopt split-height-threshold
886This variable determines when @code{display-buffer} may split a window,
887if there are multiple windows. @code{display-buffer} always splits the
888largest window if it has at least this many lines. If the largest
889window is not this tall, it is split only if it is the sole window and
890@code{pop-up-windows} is non-@code{nil}.
891@end defopt
892
893@c Emacs 19 feature
894@defopt pop-up-frames
895This variable controls whether @code{display-buffer} makes new frames.
896If it is non-@code{nil}, @code{display-buffer} looks for an existing
897window already displaying the desired buffer, on any visible frame. If
898it finds one, it returns that window. Otherwise it makes a new frame.
899The variables @code{pop-up-windows} and @code{split-height-threshold} do
900not matter if @code{pop-up-frames} is non-@code{nil}.
901
902If @code{pop-up-frames} is @code{nil}, then @code{display-buffer} either
903splits a window or reuses one.
904
905@xref{Frames}, for more information.
906@end defopt
907
908@c Emacs 19 feature
909@defvar pop-up-frame-function
910This variable specifies how to make a new frame if @code{pop-up-frames}
911is non-@code{nil}.
912
913Its value should be a function of no arguments. When
914@code{display-buffer} makes a new frame, it does so by calling that
915function, which should return a frame. The default value of the
c638661f 916variable is a function that creates a frame using parameters from
b1b12a8e
RS
917@code{pop-up-frame-alist}.
918@end defvar
919
8241495d 920@defopt pop-up-frame-alist
b1b12a8e
RS
921This variable holds an alist specifying frame parameters used when
922@code{display-buffer} makes a new frame. @xref{Frame Parameters}, for
923more information about frame parameters.
8241495d 924@end defopt
b1b12a8e 925
1911e6e5 926@defopt special-display-buffer-names
c2264295
RS
927A list of buffer names for buffers that should be displayed specially.
928If the buffer's name is in this list, @code{display-buffer} handles the
929buffer specially.
930
931By default, special display means to give the buffer a dedicated frame.
bfe721d1
KH
932
933If an element is a list, instead of a string, then the @sc{car} of the
934list is the buffer name, and the rest of the list says how to create the
935frame. There are two possibilities for the rest of the list. It can be
936an alist, specifying frame parameters, or it can contain a function and
937arguments to give to it. (The function's first argument is always the
938buffer to be displayed; the arguments from the list come after that.)
1911e6e5 939@end defopt
c2264295 940
1911e6e5 941@defopt special-display-regexps
c2264295
RS
942A list of regular expressions that specify buffers that should be
943displayed specially. If the buffer's name matches any of the regular
944expressions in this list, @code{display-buffer} handles the buffer
945specially.
946
947By default, special display means to give the buffer a dedicated frame.
bfe721d1
KH
948
949If an element is a list, instead of a string, then the @sc{car} of the
950list is the regular expression, and the rest of the list says how to
951create the frame. See above, under @code{special-display-buffer-names}.
1911e6e5 952@end defopt
c2264295
RS
953
954@defvar special-display-function
955This variable holds the function to call to display a buffer specially.
956It receives the buffer as an argument, and should return the window in
957which it is displayed.
958
959The default value of this variable is
960@code{special-display-popup-frame}.
961@end defvar
962
8241495d 963@defun special-display-popup-frame buffer &rest args
c2264295
RS
964This function makes @var{buffer} visible in a frame of its own. If
965@var{buffer} is already displayed in a window in some frame, it makes
966the frame visible and raises it, to use that window. Otherwise, it
967creates a frame that will be dedicated to @var{buffer}.
c638661f 968
8241495d
RS
969If @var{args} is an alist, it specifies frame parameters for the new
970frame.
971
972If @var{args} is a list whose @sc{car} is a symbol, then @code{(car
973@var{args})} is called as a function to actually create and set up the
974frame; it is called with @var{buffer} as first argument, and @code{(cdr
975@var{args})} as additional arguments.
976
977This function always uses an existing window displaying @var{buffer},
978whether or not it is in a frame of its own; but if you set up the above
979variables in your init file, before @var{buffer} was created, then
980presumably the window was previously made by this function.
c2264295
RS
981@end defun
982
983@defopt special-display-frame-alist
984This variable holds frame parameters for
985@code{special-display-popup-frame} to use when it creates a frame.
986@end defopt
987
864bd34b 988@defopt same-window-buffer-names
bfe721d1
KH
989A list of buffer names for buffers that should be displayed in the
990selected window. If the buffer's name is in this list,
991@code{display-buffer} handles the buffer by switching to it in the
992selected window.
864bd34b 993@end defopt
bfe721d1 994
864bd34b 995@defopt same-window-regexps
bfe721d1
KH
996A list of regular expressions that specify buffers that should be
997displayed in the selected window. If the buffer's name matches any of
998the regular expressions in this list, @code{display-buffer} handles the
999buffer by switching to it in the selected window.
864bd34b 1000@end defopt
bfe721d1 1001
b1b12a8e
RS
1002@c Emacs 19 feature
1003@defvar display-buffer-function
1004This variable is the most flexible way to customize the behavior of
1005@code{display-buffer}. If it is non-@code{nil}, it should be a function
1006that @code{display-buffer} calls to do the work. The function should
1007accept two arguments, the same two arguments that @code{display-buffer}
1008received. It should choose or create a window, display the specified
1009buffer, and then return the window.
1010
1011This hook takes precedence over all the other options and hooks
1012described above.
1013@end defvar
1014
1015@c Emacs 19 feature
1016@cindex dedicated window
1017A window can be marked as ``dedicated'' to its buffer. Then
969fe9b5
RS
1018@code{display-buffer} will not try to use that window to display any
1019other buffer.
b1b12a8e
RS
1020
1021@defun window-dedicated-p window
1022This function returns @code{t} if @var{window} is marked as dedicated;
1023otherwise @code{nil}.
1024@end defun
1025
1026@defun set-window-dedicated-p window flag
1027This function marks @var{window} as dedicated if @var{flag} is
1028non-@code{nil}, and nondedicated otherwise.
1029@end defun
1030
1031@node Window Point
1032@section Windows and Point
1033@cindex window position
1034@cindex window point
1035@cindex position in window
1036@cindex point in window
1037
1038 Each window has its own value of point, independent of the value of
1039point in other windows displaying the same buffer. This makes it useful
1040to have multiple windows showing one buffer.
1041
1042@itemize @bullet
1043@item
1044The window point is established when a window is first created; it is
1045initialized from the buffer's point, or from the window point of another
1046window opened on the buffer if such a window exists.
1047
1048@item
f9f59935
RS
1049Selecting a window sets the value of point in its buffer from the
1050window's value of point. Conversely, deselecting a window sets the
1051window's value of point from that of the buffer. Thus, when you switch
1052between windows that display a given buffer, the point value for the
1053selected window is in effect in the buffer, while the point values for
1054the other windows are stored in those windows.
b1b12a8e
RS
1055
1056@item
1057As long as the selected window displays the current buffer, the window's
1058point and the buffer's point always move together; they remain equal.
1059
1060@item
1061@xref{Positions}, for more details on buffer positions.
1062@end itemize
1063
1064 As far as the user is concerned, point is where the cursor is, and
1065when the user switches to another buffer, the cursor jumps to the
1066position of point in that buffer.
1067
8241495d 1068@defun window-point &optional window
b1b12a8e
RS
1069This function returns the current position of point in @var{window}.
1070For a nonselected window, this is the value point would have (in that
8241495d
RS
1071window's buffer) if that window were selected. If @var{window} is
1072@code{nil}, the selected window is used.
b1b12a8e
RS
1073
1074When @var{window} is the selected window and its buffer is also the
1075current buffer, the value returned is the same as point in that buffer.
1076
1077Strictly speaking, it would be more correct to return the
1078``top-level'' value of point, outside of any @code{save-excursion}
1079forms. But that value is hard to find.
1080@end defun
1081
1082@defun set-window-point window position
1083This function positions point in @var{window} at position
1084@var{position} in @var{window}'s buffer.
1085@end defun
1086
1087@node Window Start
1088@section The Window Start Position
1089
1090 Each window contains a marker used to keep track of a buffer position
c638661f 1091that specifies where in the buffer display should start. This position
b1b12a8e
RS
1092is called the @dfn{display-start} position of the window (or just the
1093@dfn{start}). The character after this position is the one that appears
1094at the upper left corner of the window. It is usually, but not
1095inevitably, at the beginning of a text line.
1096
1097@defun window-start &optional window
1098@cindex window top line
1099This function returns the display-start position of window
1100@var{window}. If @var{window} is @code{nil}, the selected window is
3c29caa8 1101used. For example,
b1b12a8e
RS
1102
1103@example
1104@group
1105(window-start)
1106 @result{} 7058
1107@end group
1108@end example
1109
c638661f 1110When you create a window, or display a different buffer in it, the
b1b12a8e
RS
1111display-start position is set to a display-start position recently used
1112for the same buffer, or 1 if the buffer doesn't have any.
1113
ea951766 1114Redisplay updates the window-start position (if you have not specified
8241495d
RS
1115it explicitly since the previous redisplay)---for example, to make sure
1116point appears on the screen. Nothing except redisplay automatically
1117changes the window-start position; if you move point, do not expect the
1118window-start position to change in response until after the next
1119redisplay.
ea951766
RS
1120
1121For a realistic example of using @code{window-start}, see the
1122description of @code{count-lines} in @ref{Text Lines}.
b1b12a8e
RS
1123@end defun
1124
969fe9b5 1125@defun window-end &optional window update
b1b12a8e
RS
1126This function returns the position of the end of the display in window
1127@var{window}. If @var{window} is @code{nil}, the selected window is
1128used.
c638661f 1129
6c7418db
RS
1130Simply changing the buffer text or moving point does not update the
1131value that @code{window-end} returns. The value is updated only when
969fe9b5 1132Emacs redisplays and redisplay completes without being preempted.
6c7418db 1133
c638661f 1134If the last redisplay of @var{window} was preempted, and did not finish,
a283f4a3 1135Emacs does not know the position of the end of display in that window.
969fe9b5 1136In that case, this function returns @code{nil}.
c638661f 1137
1911e6e5 1138If @var{update} is non-@code{nil}, @code{window-end} always returns
969fe9b5
RS
1139an up-to-date value for where the window ends. If the saved value is
1140valid, @code{window-end} returns that; otherwise it computes the correct
1141value by scanning the buffer text.
b1b12a8e
RS
1142@end defun
1143
1144@defun set-window-start window position &optional noforce
1145This function sets the display-start position of @var{window} to
c638661f 1146@var{position} in @var{window}'s buffer. It returns @var{position}.
b1b12a8e
RS
1147
1148The display routines insist that the position of point be visible when a
1149buffer is displayed. Normally, they change the display-start position
1150(that is, scroll the window) whenever necessary to make point visible.
1151However, if you specify the start position with this function using
1152@code{nil} for @var{noforce}, it means you want display to start at
1153@var{position} even if that would put the location of point off the
1154screen. If this does place point off screen, the display routines move
1155point to the left margin on the middle line in the window.
1156
1157For example, if point @w{is 1} and you set the start of the window @w{to
11582}, then point would be ``above'' the top of the window. The display
1159routines will automatically move point if it is still 1 when redisplay
1160occurs. Here is an example:
1161
1162@example
1163@group
1164;; @r{Here is what @samp{foo} looks like before executing}
1165;; @r{the @code{set-window-start} expression.}
1166@end group
1167
1168@group
1169---------- Buffer: foo ----------
1170@point{}This is the contents of buffer foo.
11712
11723
11734
11745
11756
1176---------- Buffer: foo ----------
1177@end group
1178
1179@group
1180(set-window-start
1181 (selected-window)
1182 (1+ (window-start)))
1183@result{} 2
1184@end group
1185
1186@group
1187;; @r{Here is what @samp{foo} looks like after executing}
1188;; @r{the @code{set-window-start} expression.}
1189---------- Buffer: foo ----------
1190his is the contents of buffer foo.
11912
11923
1193@point{}4
11945
11956
1196---------- Buffer: foo ----------
1197@end group
1198@end example
1199
1200If @var{noforce} is non-@code{nil}, and @var{position} would place point
1201off screen at the next redisplay, then redisplay computes a new window-start
1202position that works well with point, and thus @var{position} is not used.
b1b12a8e
RS
1203@end defun
1204
1205@defun pos-visible-in-window-p &optional position window
1206This function returns @code{t} if @var{position} is within the range
1207of text currently visible on the screen in @var{window}. It returns
1208@code{nil} if @var{position} is scrolled vertically out of view. The
1209argument @var{position} defaults to the current position of point;
1210@var{window}, to the selected window. Here is an example:
1211
1212@example
1213@group
1214(or (pos-visible-in-window-p
1215 (point) (selected-window))
1216 (recenter 0))
1217@end group
1218@end example
1219
1220The @code{pos-visible-in-window-p} function considers only vertical
1221scrolling. If @var{position} is out of view only because @var{window}
1222has been scrolled horizontally, @code{pos-visible-in-window-p} returns
8241495d 1223@code{t} anyway. @xref{Horizontal Scrolling}.
b1b12a8e
RS
1224@end defun
1225
8241495d
RS
1226@node Textual Scrolling
1227@section Textual Scrolling
1228@cindex textual scrolling
1229@cindex scrolling textually
1230
1231 @dfn{Textual scrolling} means moving the text up or down though a
1232window. It works by changing the value of the window's display-start
1233location. It may also change the value of @code{window-point} to keep
1234point on the screen.
b1b12a8e 1235
8241495d
RS
1236 Textual scrolling was formerly called ``vertical scrolling,'' but we
1237changed its name to distinguish it from the new vertical fractional
1238scrolling feature (@pxref{Vertical Scrolling}).
b1b12a8e
RS
1239
1240 In the commands @code{scroll-up} and @code{scroll-down}, the directions
1241``up'' and ``down'' refer to the motion of the text in the buffer at which
1242you are looking through the window. Imagine that the text is
1243written on a long roll of paper and that the scrolling commands move the
1244paper up and down. Thus, if you are looking at text in the middle of a
1245buffer and repeatedly call @code{scroll-down}, you will eventually see
1246the beginning of the buffer.
1247
1248 Some people have urged that the opposite convention be used: they
1249imagine that the window moves over text that remains in place. Then
1250``down'' commands would take you to the end of the buffer. This view is
1251more consistent with the actual relationship between windows and the
1252text in the buffer, but it is less like what the user sees. The
1253position of a window on the terminal does not move, and short scrolling
1254commands clearly move the text up or down on the screen. We have chosen
1255names that fit the user's point of view.
1256
8241495d
RS
1257 The textual scrolling functions (aside from
1258@code{scroll-other-window}) have unpredictable results if the current
1259buffer is different from the buffer that is displayed in the selected
1260window. @xref{Current Buffer}.
b1b12a8e
RS
1261
1262@deffn Command scroll-up &optional count
1263This function scrolls the text in the selected window upward
1264@var{count} lines. If @var{count} is negative, scrolling is actually
1265downward.
1266
1267If @var{count} is @code{nil} (or omitted), then the length of scroll
1268is @code{next-screen-context-lines} lines less than the usable height of
1269the window (not counting its mode line).
1270
1271@code{scroll-up} returns @code{nil}.
1272@end deffn
1273
1274@deffn Command scroll-down &optional count
1275This function scrolls the text in the selected window downward
1276@var{count} lines. If @var{count} is negative, scrolling is actually
1277upward.
1278
1279If @var{count} is omitted or @code{nil}, then the length of the scroll
1280is @code{next-screen-context-lines} lines less than the usable height of
c638661f 1281the window (not counting its mode line).
b1b12a8e
RS
1282
1283@code{scroll-down} returns @code{nil}.
1284@end deffn
1285
1286@deffn Command scroll-other-window &optional count
1287This function scrolls the text in another window upward @var{count}
1288lines. Negative values of @var{count}, or @code{nil}, are handled
1289as in @code{scroll-up}.
1290
8241495d
RS
1291You can specify which buffer to scroll by setting the variable
1292@code{other-window-scroll-buffer} to a buffer. If that buffer isn't
1293already displayed, @code{scroll-other-window} displays it in some
1294window.
1295
1296When the selected window is the minibuffer, the next window is normally
1297the one at the top left corner. You can specify a different window to
1298scroll, when the minibuffer is selected, by setting the variable
b1b12a8e
RS
1299@code{minibuffer-scroll-window}. This variable has no effect when any
1300other window is selected. @xref{Minibuffer Misc}.
1301
1302When the minibuffer is active, it is the next window if the selected
1303window is the one at the bottom right corner. In this case,
1304@code{scroll-other-window} attempts to scroll the minibuffer. If the
1305minibuffer contains just one line, it has nowhere to scroll to, so the
1306line reappears after the echo area momentarily displays the message
1307``Beginning of buffer''.
1308@end deffn
1309
1310@c Emacs 19 feature
1311@defvar other-window-scroll-buffer
1312If this variable is non-@code{nil}, it tells @code{scroll-other-window}
1313which buffer to scroll.
1314@end defvar
1315
1911e6e5
RS
1316@defopt scroll-margin
1317This option specifies the size of the scroll margin---a minimum number
1318of lines between point and the top or bottom of a window. Whenever
1319point gets within this many lines of the top or bottom of the window,
1320the window scrolls automatically (if possible) to move point out of the
1321margin, closer to the center of the window.
1322@end defopt
1323
1911e6e5 1324@defopt scroll-conservatively
b1b12a8e 1325This variable controls how scrolling is done automatically when point
1911e6e5
RS
1326moves off the screen (or into the scroll margin). If the value is zero,
1327then redisplay scrolls the text to center point vertically in the
1328window. If the value is a positive integer @var{n}, then redisplay
1329scrolls the window up to @var{n} lines in either direction, if that will
1330bring point back into view. Otherwise, it centers point. The default
1331value is zero.
765712a7
GM
1332
1333A value of @code{nil} is equivalent to .5, since it centers point. This
1334variable automatically becomes buffer-local when set in any fashion.
1911e6e5
RS
1335@end defopt
1336
04c1025b
GM
1337@defopt scroll-up-aggressively
1338@tindex scroll-up-aggressively
1339The value of this variable should be either @code{nil} or a fraction
1340@var{f} between 0 and 1. If it is a fraction, that specifies where on
1341the screen to put point when scrolling upward. More precisely, when a
1342window scrolls up because point is above the window start, the new start
1343position is chosen to put point @var{f} part of the window height from
1344the top. The larger @var{f}, the more aggressive the scrolling.
1345
2468d0c0
DL
1346A value of @code{nil} is equivalent to .5, since its effect is to center
1347point. This variable automatically becomes buffer-local when set in any
1348fashion.
04c1025b
GM
1349@end defopt
1350
1351@defopt scroll-down-aggressively
1352@tindex scroll-down-aggressively
1353Likewise, for scrolling down. The value, @var{f}, specifies how far
1354point should be placed from the bottom of the window; thus, as with
1355@code{scroll-up-aggressively}, a larger value scrolls more aggressively.
1356@end defopt
1357
1911e6e5
RS
1358@defopt scroll-step
1359This variable is an older variant of @code{scroll-conservatively}. The
1360difference is that it if its value is @var{n}, that permits scrolling
1361only by precisely @var{n} lines, not a smaller number. This feature
1362does not work with @code{scroll-margin}. The default value is zero.
1363@end defopt
1364
1911e6e5
RS
1365@defopt scroll-preserve-screen-position
1366If this option is non-@code{nil}, the scroll functions move point so
1367that the vertical position of the cursor is unchanged, when that is
1368possible.
b1b12a8e
RS
1369@end defopt
1370
1371@defopt next-screen-context-lines
1372The value of this variable is the number of lines of continuity to
1373retain when scrolling by full screens. For example, @code{scroll-up}
1374with an argument of @code{nil} scrolls so that this many lines at the
1375bottom of the window appear instead at the top. The default value is
1376@code{2}.
1377@end defopt
1378
1379@deffn Command recenter &optional count
1380@cindex centering point
1381This function scrolls the selected window to put the text where point
1382is located at a specified vertical position within the window.
1383
1384If @var{count} is a nonnegative number, it puts the line containing
1385point @var{count} lines down from the top of the window. If @var{count}
1386is a negative number, then it counts upward from the bottom of the
1387window, so that @minus{}1 stands for the last usable line in the window.
1388If @var{count} is a non-@code{nil} list, then it stands for the line in
1389the middle of the window.
1390
1391If @var{count} is @code{nil}, @code{recenter} puts the line containing
1392point in the middle of the window, then clears and redisplays the entire
1393selected frame.
1394
1395When @code{recenter} is called interactively, @var{count} is the raw
1396prefix argument. Thus, typing @kbd{C-u} as the prefix sets the
1397@var{count} to a non-@code{nil} list, while typing @kbd{C-u 4} sets
1398@var{count} to 4, which positions the current line four lines from the
1399top.
1400
c638661f
RS
1401With an argument of zero, @code{recenter} positions the current line at
1402the top of the window. This action is so handy that some people make a
1403separate key binding to do this. For example,
b1b12a8e
RS
1404
1405@example
1406@group
1407(defun line-to-top-of-window ()
1408 "Scroll current line to top of window.
1409Replaces three keystroke sequence C-u 0 C-l."
3c29caa8 1410 (interactive)
b1b12a8e
RS
1411 (recenter 0))
1412
3c29caa8 1413(global-set-key [kp-multiply] 'line-to-top-of-window)
b1b12a8e
RS
1414@end group
1415@end example
1416@end deffn
1417
8241495d
RS
1418@node Vertical Scrolling
1419@section Vertical Fractional Scrolling
1420@cindex Vertical Fractional Scrolling
1421
1422 @dfn{Vertical fractional scrolling} means shifting the image in the
1423window up or down by a specified multiple or fraction of a line.
1424Starting in Emacs 21, each window has a @dfn{vertical scroll position},
1425which is a number, never less than zero. It specifies how far to raise
1426the contents of the window. Raising the window contents generally makes
1427all or part of some lines disappear off the top, and all or part of some
1428other lines appear at the bottom. The usual value is zero.
1429
1430 The vertical scroll position is measured in units of the normal line
1431height, which is the height of the default font. Thus, if the value is
1432.5, that means the window contents are scrolled up half the normal line
1433height. If it is 3.3, that means the window contents are scrolled up
1434somewhat over three times the normal line height.
1435
1436 What fraction of a line the vertical scrolling covers, or how many
1437lines, depends on what the lines contain. A value of .5 could scroll a
1438line whose height is very short off the screen, while a value of 3.3
1439could scroll just part of the way through a tall line or an image.
1440
1441@defun window-vscroll &optional window
1442This function returns the current vertical scroll position of
1443@var{window}, If @var{window} is @code{nil}, the selected window is
1444used.
1445
1446@example
1447@group
1448(window-vscroll)
1449 @result{} 0
1450@end group
1451@end example
1452@end defun
1453
1454@defun set-window-vscroll window lines
1455This function sets @var{window}'s vertical scroll position to
1456@var{lines}. The argument @var{lines} should be zero or positive; if
1457not, it is taken as zero.
1458
1459The actual vertical scroll position must always correspond
1460to an integral number of pixels, so the value you specify
1461is rounded accordingly.
1462
1463The return value is the result of this rounding.
1464
1465@example
1466@group
1467(set-window-vscroll (selected-window) 1.2)
1468 @result{} 1.13
1469@end group
1470@end example
1471@end defun
1472
b1b12a8e
RS
1473@node Horizontal Scrolling
1474@section Horizontal Scrolling
1475@cindex horizontal scrolling
1476
8241495d
RS
1477 @dfn{Horizontal scrolling} means shifting the image in the window left
1478or right by a specified multiple of the normal character width. Each
1479window has a @dfn{vertical scroll position}, which is a number, never
1480less than zero. It specifies how far to shift the contents left.
1481Shifting the window contents left generally makes all or part of some
1482characters disappear off the left, and all or part of some other
1483characters appear at the right. The usual value is zero.
1484
1485 The horizontal scroll position is measured in units of the normal
1486character width, which is the width of space in the default font. Thus,
1487if the value is 5, that means the window contents are scrolled left by 5
1488times the the normal character width. How many characters actually
1489disappear off to the left depends on their width, and could vary from
1490line to line.
1491
1492 Because we read from side to side in the ``inner loop'', and from top
1493to bottom in the ``outer loop'', the effect of horizontal scrolling is
1494not like that of textual or vertical scrolling. Textual scrolling
1495involves selection of a portion of text to display, and vertical
1496scrolling moves the window contents contiguously; but horizontal
1497scrolling causes part of @emph{each line} to go off screen.
b1b12a8e
RS
1498
1499 Usually, no horizontal scrolling is in effect; then the leftmost
1500column is at the left edge of the window. In this state, scrolling to
8241495d
RS
1501the right is meaningless, since there is no data to the left of the edge
1502to be revealed by it; so this is not allowed. Scrolling to the left is
1503allowed; it scrolls the first columns of text off the edge of the window
1504and can reveal additional columns on the right that were truncated
1505before. Once a window has a nonzero amount of leftward horizontal
1506scrolling, you can scroll it back to the right, but only so far as to
1507reduce the net horizontal scroll to zero. There is no limit to how far
1508left you can scroll, but eventually all the text will disappear off the
1509left edge.
1510
1511 In Emacs 21, redisplay automatically alters the horizontal scrolling
1512of a window as necessary to ensure that point is always visible.
1513However, you can still set the horizontal scrolling value explicitly.
1514The value you specify will be used, provided it leaves point visible.
1515
1516@deffn Command scroll-left &optional count
b1b12a8e 1517This function scrolls the selected window @var{count} columns to the
8241495d
RS
1518left (or to the right if @var{count} is negative). The default
1519for @var{count} is the window width, minus 2.
1520
1521The return value is the total amount of leftward horizontal scrolling in
1522effect after the change---just like the value returned by
1523@code{window-hscroll} (below).
b1b12a8e
RS
1524@end deffn
1525
8241495d 1526@deffn Command scroll-right &optional count
b1b12a8e 1527This function scrolls the selected window @var{count} columns to the
8241495d
RS
1528right (or to the left if @var{count} is negative). The default
1529for @var{count} is the window width, minus 2.
1530
1531The return value is the total amount of leftward horizontal scrolling in
1532effect after the change---just like the value returned by
1533@code{window-hscroll} (below).
b1b12a8e
RS
1534
1535Once you scroll a window as far right as it can go, back to its normal
1536position where the total leftward scrolling is zero, attempts to scroll
1537any farther right have no effect.
1538@end deffn
1539
1540@defun window-hscroll &optional window
1541This function returns the total leftward horizontal scrolling of
1542@var{window}---the number of columns by which the text in @var{window}
1543is scrolled left past the left margin.
1544
1545The value is never negative. It is zero when no horizontal scrolling
1546has been done in @var{window} (which is usually the case).
1547
1548If @var{window} is @code{nil}, the selected window is used.
1549
1550@example
1551@group
1552(window-hscroll)
1553 @result{} 0
1554@end group
1555@group
1556(scroll-left 5)
1557 @result{} 5
1558@end group
1559@group
1560(window-hscroll)
1561 @result{} 5
1562@end group
1563@end example
1564@end defun
1565
1566@defun set-window-hscroll window columns
1567This function sets the number of columns from the left margin that
f9f59935 1568@var{window} is scrolled from the value of @var{columns}. The argument
b1b12a8e 1569@var{columns} should be zero or positive; if not, it is taken as zero.
8241495d 1570Fractional values of @var{columns} are not supported at present.
b1b12a8e
RS
1571
1572The value returned is @var{columns}.
1573
1574@example
1575@group
1576(set-window-hscroll (selected-window) 10)
1577 @result{} 10
1578@end group
1579@end example
1580@end defun
1581
1582 Here is how you can determine whether a given position @var{position}
1583is off the screen due to horizontal scrolling:
1584
1585@example
1586@group
c638661f 1587(defun hscroll-on-screen (window position)
3c29caa8 1588 (save-excursion
c638661f 1589 (goto-char position)
3c29caa8 1590 (and
c638661f
RS
1591 (>= (- (current-column) (window-hscroll window)) 0)
1592 (< (- (current-column) (window-hscroll window))
1593 (window-width window)))))
b1b12a8e
RS
1594@end group
1595@end example
1596
1597@node Size of Window
1598@section The Size of a Window
1599@cindex window size
1600@cindex size of window
1601
1602 An Emacs window is rectangular, and its size information consists of
1603the height (the number of lines) and the width (the number of character
1604positions in each line). The mode line is included in the height. But
1605the width does not count the scroll bar or the column of @samp{|}
c638661f 1606characters that separates side-by-side windows.
b1b12a8e
RS
1607
1608 The following three functions return size information about a window:
1609
1610@defun window-height &optional window
969fe9b5
RS
1611This function returns the number of lines in @var{window}, including its
1612mode line. If @var{window} fills its entire frame, this is typically
1613one less than the value of @code{frame-height} on that frame (since the
1614last line is always reserved for the minibuffer).
b1b12a8e
RS
1615
1616If @var{window} is @code{nil}, the function uses the selected window.
1617
1618@example
1619@group
1620(window-height)
1621 @result{} 23
1622@end group
1623@group
1624(split-window-vertically)
1625 @result{} #<window 4 on windows.texi>
1626@end group
1627@group
1628(window-height)
1629 @result{} 11
1630@end group
1631@end example
1632@end defun
1633
1634@defun window-width &optional window
1635This function returns the number of columns in @var{window}. If
1636@var{window} fills its entire frame, this is the same as the value of
1637@code{frame-width} on that frame. The width does not include the
1638window's scroll bar or the column of @samp{|} characters that separates
1639side-by-side windows.
1640
1641If @var{window} is @code{nil}, the function uses the selected window.
1642
1643@example
1644@group
1645(window-width)
1646 @result{} 80
1647@end group
1648@end example
1649@end defun
1650
1651@defun window-edges &optional window
1652This function returns a list of the edge coordinates of @var{window}.
1653If @var{window} is @code{nil}, the selected window is used.
1654
1655The order of the list is @code{(@var{left} @var{top} @var{right}
1656@var{bottom})}, all elements relative to 0, 0 at the top left corner of
1657the frame. The element @var{right} of the value is one more than the
1658rightmost column used by @var{window}, and @var{bottom} is one more than
1659the bottommost row used by @var{window} and its mode-line.
1660
8241495d
RS
1661If a window has a scroll bar, the right edge value includes the width of
1662the scroll bar. Otherwise, if the window has a neighbor on the right,
1663its right edge value includes the width of the separator line between
1664the window and that neighbor. Since the width of the window does not
1665include this separator, the width does not usually equal the difference
1666between the right and left edges.
b1b12a8e
RS
1667
1668Here is the result obtained on a typical 24-line terminal with just one
1669window:
1670
1671@example
1672@group
1673(window-edges (selected-window))
1674 @result{} (0 0 80 23)
1675@end group
1676@end example
1677
c638661f
RS
1678@noindent
1679The bottom edge is at line 23 because the last line is the echo area.
1680
fb1d9004
RS
1681If @var{window} is at the upper left corner of its frame, then
1682@var{bottom} is the same as the value of @code{(window-height)},
8241495d
RS
1683@var{right} is almost the same as the value of @code{(window-width)},
1684and @var{top} and @var{left} are zero. For example, the edges of the
1685following window are @w{@samp{0 0 8 5}}. Assuming that the frame has
1686more than 8 columns, the last column of the window (column 7) holds a
1687border rather than text. The last row (row 4) holds the mode line,
1688shown here with @samp{xxxxxxxxx}.
b1b12a8e
RS
1689
1690@example
1691@group
3c29caa8 1692 0
b1b12a8e 1693 _______
3c29caa8
DH
1694 0 | |
1695 | |
1696 | |
1697 | |
b1b12a8e
RS
1698 xxxxxxxxx 4
1699
3c29caa8 1700 7
b1b12a8e
RS
1701@end group
1702@end example
1703
b1b12a8e
RS
1704In the following example, let's suppose that the frame is 7
1705columns wide. Then the edges of the left window are @w{@samp{0 0 4 3}}
8241495d 1706and the edges of the right window are @w{@samp{4 0 8 3}}.
b1b12a8e
RS
1707
1708@example
1709@group
1710 ___ ___
3c29caa8
DH
1711 | | |
1712 | | |
1713 xxxxxxxxx
b1b12a8e
RS
1714
1715 0 34 7
1716@end group
1717@end example
1718@end defun
1719
1720@node Resizing Windows
1721@section Changing the Size of a Window
1722@cindex window resizing
1723@cindex changing window size
1724@cindex window size, changing
1725
1726 The window size functions fall into two classes: high-level commands
1727that change the size of windows and low-level functions that access
1728window size. Emacs does not permit overlapping windows or gaps between
1729windows, so resizing one window affects other windows.
1730
1731@deffn Command enlarge-window size &optional horizontal
c638661f 1732This function makes the selected window @var{size} lines taller,
b1b12a8e
RS
1733stealing lines from neighboring windows. It takes the lines from one
1734window at a time until that window is used up, then takes from another.
1735If a window from which lines are stolen shrinks below
1736@code{window-min-height} lines, that window disappears.
1737
1738If @var{horizontal} is non-@code{nil}, this function makes
1739@var{window} wider by @var{size} columns, stealing columns instead of
1740lines. If a window from which columns are stolen shrinks below
1741@code{window-min-width} columns, that window disappears.
1742
c638661f
RS
1743If the requested size would exceed that of the window's frame, then the
1744function makes the window occupy the entire height (or width) of the
1745frame.
b1b12a8e 1746
8241495d
RS
1747If there are various other windows from which lines or columns can be
1748stolen, and some of them specify fixed size (using
1749@code{window-size-fixed}, see below), they are left untouched while
1750other windows are ``robbed.'' If it would be necessary to alter the
1751size of a fixed-size window, @code{enlarge-window} gets an error
1752instead.
1753
b1b12a8e
RS
1754If @var{size} is negative, this function shrinks the window by
1755@minus{}@var{size} lines or columns. If that makes the window smaller
1756than the minimum size (@code{window-min-height} and
1757@code{window-min-width}), @code{enlarge-window} deletes the window.
1758
3c29caa8 1759@code{enlarge-window} returns @code{nil}.
b1b12a8e
RS
1760@end deffn
1761
1762@deffn Command enlarge-window-horizontally columns
1763This function makes the selected window @var{columns} wider.
1764It could be defined as follows:
1765
1766@example
1767@group
1768(defun enlarge-window-horizontally (columns)
1769 (enlarge-window columns t))
1770@end group
1771@end example
1772@end deffn
1773
1774@deffn Command shrink-window size &optional horizontal
1775This function is like @code{enlarge-window} but negates the argument
1776@var{size}, making the selected window smaller by giving lines (or
1777columns) to the other windows. If the window shrinks below
1778@code{window-min-height} or @code{window-min-width}, then it disappears.
1779
1780If @var{size} is negative, the window is enlarged by @minus{}@var{size}
1781lines or columns.
1782@end deffn
1783
1784@deffn Command shrink-window-horizontally columns
1785This function makes the selected window @var{columns} narrower.
1786It could be defined as follows:
1787
1788@example
1789@group
1790(defun shrink-window-horizontally (columns)
1791 (shrink-window columns t))
1792@end group
1793@end example
1794@end deffn
1795
8241495d 1796@deffn Command shrink-window-if-larger-than-buffer &optional window
1911e6e5
RS
1797This command shrinks @var{window} to be as small as possible while still
1798showing the full contents of its buffer---but not less than
8241495d
RS
1799@code{window-min-height} lines. If @var{window} is not given,
1800it defaults to the selected window.
1911e6e5
RS
1801
1802However, the command does nothing if the window is already too small to
1803display the whole text of the buffer, or if part of the contents are
1804currently scrolled off screen, or if the window is not the full width of
1805its frame, or if the window is the only window in its frame.
1806@end deffn
1807
8241495d
RS
1808@tindex window-size-fixed
1809@defvar window-size-fixed
1810If this variable is non-@code{nil}, in any given buffer,
1811then the size of any window displaying the buffer remains fixed
1812unless you explicitly change it or Emacs has no other choice.
1813(This feature is new in Emacs 21.)
1814
1815If the value is @code{height}, then only the window's height is fixed;
1816if the value is @code{width}, then only the window's width is fixed.
1817Any other non-@code{nil} value fixes both the width and the height.
1818
1819The usual way to use this variable is to give it a buffer-local value in
1820a particular buffer. That way, the windows (but usually there is only
1821one) displaying that buffer have fixed size.
1822
1823Explicit size-change functions such as @code{enlarge-window}
1824get an error if they would have to change a window size which is fixed.
1825Therefore, when you want to change the size of such a window,
1826you should bind @code{window-size-fixed} to @code{nil}, like this:
1827
1828@example
1829(let ((window-size-fixed nil))
1830 (enlarge-window 10))
1831@end example
1832
1833Note that changing the frame size will change the size of a
1834fixed-size window, if there is no other alternative.
1835@end defvar
1836
b1b12a8e 1837@cindex minimum window size
c638661f 1838 The following two variables constrain the window-size-changing
b1b12a8e
RS
1839functions to a minimum height and width.
1840
1841@defopt window-min-height
1842The value of this variable determines how short a window may become
1843before it is automatically deleted. Making a window smaller than
1844@code{window-min-height} automatically deletes it, and no window may be
1845created shorter than this. The absolute minimum height is two (allowing
1846one line for the mode line, and one line for the buffer display).
c638661f 1847Actions that change window sizes reset this variable to two if it is
b1b12a8e
RS
1848less than two. The default value is 4.
1849@end defopt
1850
1851@defopt window-min-width
1852The value of this variable determines how narrow a window may become
1911e6e5 1853before it is automatically deleted. Making a window smaller than
b1b12a8e
RS
1854@code{window-min-width} automatically deletes it, and no window may be
1855created narrower than this. The absolute minimum width is one; any
1856value below that is ignored. The default value is 10.
1857@end defopt
1858
1859@node Coordinates and Windows
1860@section Coordinates and Windows
1861
c638661f 1862This section describes how to relate screen coordinates to windows.
b1b12a8e
RS
1863
1864@defun window-at x y &optional frame
1865This function returns the window containing the specified cursor
1866position in the frame @var{frame}. The coordinates @var{x} and @var{y}
1867are measured in characters and count from the top left corner of the
1868frame. If they are out of range, @code{window-at} returns @code{nil}.
1869
1870If you omit @var{frame}, the selected frame is used.
1871@end defun
1872
1873@defun coordinates-in-window-p coordinates window
1874This function checks whether a particular frame position falls within
1875the window @var{window}.
1876
969fe9b5
RS
1877The argument @var{coordinates} is a cons cell of the form @code{(@var{x}
1878. @var{y})}. The coordinates @var{x} and @var{y} are measured in
1879characters, and count from the top left corner of the screen or frame.
b1b12a8e 1880
f9f59935
RS
1881The value returned by @code{coordinates-in-window-p} is non-@code{nil}
1882if the coordinates are inside @var{window}. The value also indicates
1883what part of the window the position is in, as follows:
b1b12a8e
RS
1884
1885@table @code
1886@item (@var{relx} . @var{rely})
1887The coordinates are inside @var{window}. The numbers @var{relx} and
1888@var{rely} are the equivalent window-relative coordinates for the
1889specified position, counting from 0 at the top left corner of the
1890window.
1891
1892@item mode-line
1893The coordinates are in the mode line of @var{window}.
1894
8241495d
RS
1895@item header-line
1896The coordinates are in the header line of @var{window}.
1897
1898@item vertical-line
b1b12a8e 1899The coordinates are in the vertical line between @var{window} and its
3c29caa8 1900neighbor to the right. This value occurs only if the window doesn't
b1b12a8e 1901have a scroll bar; positions in a scroll bar are considered outside the
8241495d 1902window for these purposes.
b1b12a8e
RS
1903
1904@item nil
1905The coordinates are not in any part of @var{window}.
1906@end table
1907
1908The function @code{coordinates-in-window-p} does not require a frame as
1909argument because it always uses the frame that @var{window} is on.
1910@end defun
1911
1912@node Window Configurations
1913@section Window Configurations
1914@cindex window configurations
1915@cindex saving window information
1916
f9f59935 1917 A @dfn{window configuration} records the entire layout of one
b1b12a8e
RS
1918frame---all windows, their sizes, which buffers they contain, what part
1919of each buffer is displayed, and the values of point and the mark. You
1920can bring back an entire previous layout by restoring a window
1921configuration previously saved.
1922
1923 If you want to record all frames instead of just one, use a frame
1924configuration instead of a window configuration. @xref{Frame
1925Configurations}.
1926
8241495d
RS
1927@defun current-window-configuration &optional frame
1928This function returns a new object representing @var{frame}'s
f9f59935
RS
1929current window configuration, including the number of windows, their
1930sizes and current buffers, which window is the selected window, and for
1931each window the displayed buffer, the display-start position, and the
969fe9b5
RS
1932positions of point and the mark. It also includes the values of
1933@code{window-min-height}, @code{window-min-width} and
1934@code{minibuffer-scroll-window}. An exception is made for point in the
f9f59935 1935current buffer, whose value is not saved.
8241495d
RS
1936
1937If @var{frame} is omitted, the selected frame is used.
b1b12a8e
RS
1938@end defun
1939
1940@defun set-window-configuration configuration
f9f59935 1941This function restores the configuration of windows and buffers as
8241495d
RS
1942specified by @var{configuration}, for the frame that @var{configuration}
1943was created for.
1944
1945The argument @var{configuration} must be a value that was previously
1946returned by @code{current-window-configuration}. This configuration is
1947restored in the frame from which @var{configuration} was made, whether
1948that frame is selected or not. This always counts as a window size
1949change and triggers execution of the @code{window-size-change-functions}
969fe9b5
RS
1950(@pxref{Window Hooks}), because @code{set-window-configuration} doesn't
1951know how to tell whether the new configuration actually differs from the
1952old one.
1953
1954If the frame which @var{configuration} was saved from is dead, all this
1955function does is restore the three variables @code{window-min-height},
1956@code{window-min-width} and @code{minibuffer-scroll-window}.
bfe721d1 1957
b1b12a8e
RS
1958Here is a way of using this function to get the same effect
1959as @code{save-window-excursion}:
1960
1961@example
1962@group
1963(let ((config (current-window-configuration)))
1964 (unwind-protect
1965 (progn (split-window-vertically nil)
1966 @dots{})
1967 (set-window-configuration config)))
1968@end group
1969@end example
1970@end defun
1971
1972@defspec save-window-excursion forms@dots{}
1973This special form records the window configuration, executes @var{forms}
1974in sequence, then restores the earlier window configuration. The window
1975configuration includes the value of point and the portion of the buffer
c638661f 1976that is visible. It also includes the choice of selected window.
b1b12a8e 1977However, it does not include the value of point in the current buffer;
f9f59935 1978use @code{save-excursion} also, if you wish to preserve that.
b1b12a8e 1979
bfe721d1
KH
1980Don't use this construct when @code{save-selected-window} is all you need.
1981
1982Exit from @code{save-window-excursion} always triggers execution of the
1983@code{window-size-change-functions}. (It doesn't know how to tell
1984whether the restored configuration actually differs from the one in
1985effect at the end of the @var{forms}.)
1986
b1b12a8e
RS
1987The return value is the value of the final form in @var{forms}.
1988For example:
1989
1990@example
1991@group
1992(split-window)
1993 @result{} #<window 25 on control.texi>
1994@end group
1995@group
1996(setq w (selected-window))
1997 @result{} #<window 19 on control.texi>
1998@end group
1999@group
2000(save-window-excursion
2001 (delete-other-windows w)
2002 (switch-to-buffer "foo")
2003 'do-something)
2004 @result{} do-something
2005 ;; @r{The screen is now split again.}
2006@end group
2007@end example
2008@end defspec
2009
2010@defun window-configuration-p object
2011This function returns @code{t} if @var{object} is a window configuration.
969fe9b5
RS
2012@end defun
2013
2014@defun compare-window-configurations config1 config2
2015This function compares two window configurations as regards the
2016structure of windows, but ignores the values of point and mark and the
2017saved scrolling positions---it can return @code{t} even if those
2018aspects differ.
2019
2020The function @code{equal} can also compare two window configurations; it
2021regards configurations as unequal if they differ in any respect, even a
2022saved point or mark.
b1b12a8e
RS
2023@end defun
2024
2025 Primitives to look inside of window configurations would make sense,
2026but none are implemented. It is not clear they are useful enough to be
2027worth implementing.
f9f59935
RS
2028
2029@node Window Hooks
2030@section Hooks for Window Scrolling and Changes
2031
2032This section describes how a Lisp program can take action whenever a
2033window displays a different part of its buffer or a different buffer.
2034There are three actions that can change this: scrolling the window,
2035switching buffers in the window, and changing the size of the window.
2036The first two actions run @code{window-scroll-functions}; the last runs
2037@code{window-size-change-functions}. The paradigmatic use of these
969fe9b5
RS
2038hooks is in the implementation of Lazy Lock mode; see @ref{Support
2039Modes, Lazy Lock, Font Lock Support Modes, emacs, The GNU Emacs Manual}.
f9f59935
RS
2040
2041@defvar window-scroll-functions
2042This variable holds a list of functions that Emacs should call before
2043redisplaying a window with scrolling. It is not a normal hook, because
2044each function is called with two arguments: the window, and its new
2045display-start position.
2046
2047Displaying a different buffer in the window also runs these functions.
2048
1911e6e5
RS
2049These functions must be careful in using @code{window-end}
2050(@pxref{Window Start}); if you need an up-to-date value, you must use
2051the @var{update} argument to ensure you get it.
f9f59935
RS
2052@end defvar
2053
2054@defvar window-size-change-functions
2055This variable holds a list of functions to be called if the size of any
2056window changes for any reason. The functions are called just once per
2057redisplay, and just once for each frame on which size changes have
2058occurred.
2059
2060Each function receives the frame as its sole argument. There is no
2061direct way to find out which windows on that frame have changed size, or
2062precisely how. However, if a size-change function records, at each
2063call, the existing windows and their sizes, it can also compare the
2064present sizes and the previous sizes.
2065
2066Creating or deleting windows counts as a size change, and therefore
2067causes these functions to be called. Changing the frame size also
2068counts, because it changes the sizes of the existing windows.
2069
2070It is not a good idea to use @code{save-window-excursion} (@pxref{Window
2071Configurations}) in these functions, because that always counts as a
2072size change, and it would cause these functions to be called over and
2073over. In most cases, @code{save-selected-window} (@pxref{Selecting
2074Windows}) is what you need here.
2075@end defvar
2076
f9f59935 2077@defvar redisplay-end-trigger-functions
1911e6e5 2078This abnormal hook is run whenever redisplay in a window uses text that
f9f59935
RS
2079extends past a specified end trigger position. You set the end trigger
2080position with the function @code{set-window-redisplay-end-trigger}. The
2081functions are called with two arguments: the window, and the end trigger
2082position. Storing @code{nil} for the end trigger position turns off the
2083feature, and the trigger value is automatically reset to @code{nil} just
2084after the hook is run.
2085@end defvar
2086
f9f59935
RS
2087@defun set-window-redisplay-end-trigger window position
2088This function sets @var{window}'s end trigger position at
2089@var{position}.
2090@end defun
2091
8241495d 2092@defun window-redisplay-end-trigger &optional window
f9f59935
RS
2093This function returns @var{window}'s current end trigger position.
2094@end defun
2095
f9f59935
RS
2096@defvar window-configuration-change-hook
2097A normal hook that is run every time you change the window configuration
2098of an existing frame. This includes splitting or deleting windows,
2099changing the sizes of windows, or displaying a different buffer in a
2100window. The frame whose window configuration has changed is the
2101selected frame when this hook runs.
2102@end defvar