Mention antlr-mode.
[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
4f0308e1
GM
893@defopt even-window-heights
894This variable determines if @code{display-buffer} should even out window
895heights if the buffer gets displayed in an existing window, above or
896beneath another existing window. If @code{even-window-heights} is
897@code{t}, the default, window heights will be evened out. If
898@code{even-window-heights} is @code{nil}, the orginal window heights
899will be left alone.
fbd9f276 900@end defopt
4f0308e1 901
b1b12a8e
RS
902@c Emacs 19 feature
903@defopt pop-up-frames
904This variable controls whether @code{display-buffer} makes new frames.
905If it is non-@code{nil}, @code{display-buffer} looks for an existing
906window already displaying the desired buffer, on any visible frame. If
907it finds one, it returns that window. Otherwise it makes a new frame.
908The variables @code{pop-up-windows} and @code{split-height-threshold} do
909not matter if @code{pop-up-frames} is non-@code{nil}.
910
911If @code{pop-up-frames} is @code{nil}, then @code{display-buffer} either
912splits a window or reuses one.
913
914@xref{Frames}, for more information.
915@end defopt
916
917@c Emacs 19 feature
918@defvar pop-up-frame-function
919This variable specifies how to make a new frame if @code{pop-up-frames}
920is non-@code{nil}.
921
922Its value should be a function of no arguments. When
923@code{display-buffer} makes a new frame, it does so by calling that
924function, which should return a frame. The default value of the
c638661f 925variable is a function that creates a frame using parameters from
b1b12a8e
RS
926@code{pop-up-frame-alist}.
927@end defvar
928
8241495d 929@defopt pop-up-frame-alist
b1b12a8e
RS
930This variable holds an alist specifying frame parameters used when
931@code{display-buffer} makes a new frame. @xref{Frame Parameters}, for
932more information about frame parameters.
8241495d 933@end defopt
b1b12a8e 934
1911e6e5 935@defopt special-display-buffer-names
c2264295
RS
936A list of buffer names for buffers that should be displayed specially.
937If the buffer's name is in this list, @code{display-buffer} handles the
938buffer specially.
939
940By default, special display means to give the buffer a dedicated frame.
bfe721d1
KH
941
942If an element is a list, instead of a string, then the @sc{car} of the
943list is the buffer name, and the rest of the list says how to create the
944frame. There are two possibilities for the rest of the list. It can be
945an alist, specifying frame parameters, or it can contain a function and
946arguments to give to it. (The function's first argument is always the
947buffer to be displayed; the arguments from the list come after that.)
1911e6e5 948@end defopt
c2264295 949
1911e6e5 950@defopt special-display-regexps
c2264295
RS
951A list of regular expressions that specify buffers that should be
952displayed specially. If the buffer's name matches any of the regular
953expressions in this list, @code{display-buffer} handles the buffer
954specially.
955
956By default, special display means to give the buffer a dedicated frame.
bfe721d1
KH
957
958If an element is a list, instead of a string, then the @sc{car} of the
959list is the regular expression, and the rest of the list says how to
960create the frame. See above, under @code{special-display-buffer-names}.
1911e6e5 961@end defopt
c2264295
RS
962
963@defvar special-display-function
964This variable holds the function to call to display a buffer specially.
965It receives the buffer as an argument, and should return the window in
966which it is displayed.
967
968The default value of this variable is
969@code{special-display-popup-frame}.
970@end defvar
971
8241495d 972@defun special-display-popup-frame buffer &rest args
c2264295
RS
973This function makes @var{buffer} visible in a frame of its own. If
974@var{buffer} is already displayed in a window in some frame, it makes
975the frame visible and raises it, to use that window. Otherwise, it
976creates a frame that will be dedicated to @var{buffer}.
c638661f 977
8241495d
RS
978If @var{args} is an alist, it specifies frame parameters for the new
979frame.
980
981If @var{args} is a list whose @sc{car} is a symbol, then @code{(car
982@var{args})} is called as a function to actually create and set up the
983frame; it is called with @var{buffer} as first argument, and @code{(cdr
984@var{args})} as additional arguments.
985
986This function always uses an existing window displaying @var{buffer},
987whether or not it is in a frame of its own; but if you set up the above
988variables in your init file, before @var{buffer} was created, then
989presumably the window was previously made by this function.
c2264295
RS
990@end defun
991
992@defopt special-display-frame-alist
993This variable holds frame parameters for
994@code{special-display-popup-frame} to use when it creates a frame.
995@end defopt
996
864bd34b 997@defopt same-window-buffer-names
bfe721d1
KH
998A list of buffer names for buffers that should be displayed in the
999selected window. If the buffer's name is in this list,
1000@code{display-buffer} handles the buffer by switching to it in the
1001selected window.
864bd34b 1002@end defopt
bfe721d1 1003
864bd34b 1004@defopt same-window-regexps
bfe721d1
KH
1005A list of regular expressions that specify buffers that should be
1006displayed in the selected window. If the buffer's name matches any of
1007the regular expressions in this list, @code{display-buffer} handles the
1008buffer by switching to it in the selected window.
864bd34b 1009@end defopt
bfe721d1 1010
b1b12a8e
RS
1011@c Emacs 19 feature
1012@defvar display-buffer-function
1013This variable is the most flexible way to customize the behavior of
1014@code{display-buffer}. If it is non-@code{nil}, it should be a function
1015that @code{display-buffer} calls to do the work. The function should
1016accept two arguments, the same two arguments that @code{display-buffer}
1017received. It should choose or create a window, display the specified
1018buffer, and then return the window.
1019
1020This hook takes precedence over all the other options and hooks
1021described above.
1022@end defvar
1023
1024@c Emacs 19 feature
1025@cindex dedicated window
1026A window can be marked as ``dedicated'' to its buffer. Then
969fe9b5
RS
1027@code{display-buffer} will not try to use that window to display any
1028other buffer.
b1b12a8e
RS
1029
1030@defun window-dedicated-p window
1031This function returns @code{t} if @var{window} is marked as dedicated;
1032otherwise @code{nil}.
1033@end defun
1034
1035@defun set-window-dedicated-p window flag
1036This function marks @var{window} as dedicated if @var{flag} is
1037non-@code{nil}, and nondedicated otherwise.
1038@end defun
1039
1040@node Window Point
1041@section Windows and Point
1042@cindex window position
1043@cindex window point
1044@cindex position in window
1045@cindex point in window
1046
1047 Each window has its own value of point, independent of the value of
1048point in other windows displaying the same buffer. This makes it useful
1049to have multiple windows showing one buffer.
1050
1051@itemize @bullet
1052@item
1053The window point is established when a window is first created; it is
1054initialized from the buffer's point, or from the window point of another
1055window opened on the buffer if such a window exists.
1056
1057@item
f9f59935
RS
1058Selecting a window sets the value of point in its buffer from the
1059window's value of point. Conversely, deselecting a window sets the
1060window's value of point from that of the buffer. Thus, when you switch
1061between windows that display a given buffer, the point value for the
1062selected window is in effect in the buffer, while the point values for
1063the other windows are stored in those windows.
b1b12a8e
RS
1064
1065@item
1066As long as the selected window displays the current buffer, the window's
1067point and the buffer's point always move together; they remain equal.
1068
1069@item
1070@xref{Positions}, for more details on buffer positions.
1071@end itemize
1072
1073 As far as the user is concerned, point is where the cursor is, and
1074when the user switches to another buffer, the cursor jumps to the
1075position of point in that buffer.
1076
8241495d 1077@defun window-point &optional window
b1b12a8e
RS
1078This function returns the current position of point in @var{window}.
1079For a nonselected window, this is the value point would have (in that
8241495d
RS
1080window's buffer) if that window were selected. If @var{window} is
1081@code{nil}, the selected window is used.
b1b12a8e
RS
1082
1083When @var{window} is the selected window and its buffer is also the
1084current buffer, the value returned is the same as point in that buffer.
1085
1086Strictly speaking, it would be more correct to return the
1087``top-level'' value of point, outside of any @code{save-excursion}
1088forms. But that value is hard to find.
1089@end defun
1090
1091@defun set-window-point window position
1092This function positions point in @var{window} at position
1093@var{position} in @var{window}'s buffer.
1094@end defun
1095
1096@node Window Start
1097@section The Window Start Position
1098
1099 Each window contains a marker used to keep track of a buffer position
c638661f 1100that specifies where in the buffer display should start. This position
b1b12a8e
RS
1101is called the @dfn{display-start} position of the window (or just the
1102@dfn{start}). The character after this position is the one that appears
1103at the upper left corner of the window. It is usually, but not
1104inevitably, at the beginning of a text line.
1105
1106@defun window-start &optional window
1107@cindex window top line
1108This function returns the display-start position of window
1109@var{window}. If @var{window} is @code{nil}, the selected window is
3c29caa8 1110used. For example,
b1b12a8e
RS
1111
1112@example
1113@group
1114(window-start)
1115 @result{} 7058
1116@end group
1117@end example
1118
c638661f 1119When you create a window, or display a different buffer in it, the
b1b12a8e
RS
1120display-start position is set to a display-start position recently used
1121for the same buffer, or 1 if the buffer doesn't have any.
1122
ea951766 1123Redisplay updates the window-start position (if you have not specified
8241495d
RS
1124it explicitly since the previous redisplay)---for example, to make sure
1125point appears on the screen. Nothing except redisplay automatically
1126changes the window-start position; if you move point, do not expect the
1127window-start position to change in response until after the next
1128redisplay.
ea951766
RS
1129
1130For a realistic example of using @code{window-start}, see the
1131description of @code{count-lines} in @ref{Text Lines}.
b1b12a8e
RS
1132@end defun
1133
969fe9b5 1134@defun window-end &optional window update
b1b12a8e
RS
1135This function returns the position of the end of the display in window
1136@var{window}. If @var{window} is @code{nil}, the selected window is
1137used.
c638661f 1138
6c7418db
RS
1139Simply changing the buffer text or moving point does not update the
1140value that @code{window-end} returns. The value is updated only when
969fe9b5 1141Emacs redisplays and redisplay completes without being preempted.
6c7418db 1142
c638661f 1143If the last redisplay of @var{window} was preempted, and did not finish,
a283f4a3 1144Emacs does not know the position of the end of display in that window.
969fe9b5 1145In that case, this function returns @code{nil}.
c638661f 1146
1911e6e5 1147If @var{update} is non-@code{nil}, @code{window-end} always returns
969fe9b5
RS
1148an up-to-date value for where the window ends. If the saved value is
1149valid, @code{window-end} returns that; otherwise it computes the correct
1150value by scanning the buffer text.
b1b12a8e
RS
1151@end defun
1152
1153@defun set-window-start window position &optional noforce
1154This function sets the display-start position of @var{window} to
c638661f 1155@var{position} in @var{window}'s buffer. It returns @var{position}.
b1b12a8e
RS
1156
1157The display routines insist that the position of point be visible when a
1158buffer is displayed. Normally, they change the display-start position
1159(that is, scroll the window) whenever necessary to make point visible.
1160However, if you specify the start position with this function using
1161@code{nil} for @var{noforce}, it means you want display to start at
1162@var{position} even if that would put the location of point off the
1163screen. If this does place point off screen, the display routines move
1164point to the left margin on the middle line in the window.
1165
1166For example, if point @w{is 1} and you set the start of the window @w{to
11672}, then point would be ``above'' the top of the window. The display
1168routines will automatically move point if it is still 1 when redisplay
1169occurs. Here is an example:
1170
1171@example
1172@group
1173;; @r{Here is what @samp{foo} looks like before executing}
1174;; @r{the @code{set-window-start} expression.}
1175@end group
1176
1177@group
1178---------- Buffer: foo ----------
1179@point{}This is the contents of buffer foo.
11802
11813
11824
11835
11846
1185---------- Buffer: foo ----------
1186@end group
1187
1188@group
1189(set-window-start
1190 (selected-window)
1191 (1+ (window-start)))
1192@result{} 2
1193@end group
1194
1195@group
1196;; @r{Here is what @samp{foo} looks like after executing}
1197;; @r{the @code{set-window-start} expression.}
1198---------- Buffer: foo ----------
1199his is the contents of buffer foo.
12002
12013
1202@point{}4
12035
12046
1205---------- Buffer: foo ----------
1206@end group
1207@end example
1208
1209If @var{noforce} is non-@code{nil}, and @var{position} would place point
1210off screen at the next redisplay, then redisplay computes a new window-start
1211position that works well with point, and thus @var{position} is not used.
b1b12a8e
RS
1212@end defun
1213
00480554 1214@defun pos-visible-in-window-p &optional position window partially
601bda2e 1215This function returns @code{t} if @var{position} is within the range of
00480554
MB
1216text currently visible on the screen in @var{window}. It returns
1217@code{nil} if @var{position} is scrolled vertically or horizontally out
1218of view. Locations that are partially obscured are not considered
1219visible unless @var{partially} is non-@code{nil}. The argument
1220@var{position} defaults to the current position of point in
1221@var{window}; @var{window}, to the selected window.
1222
1223Here is an example:
b1b12a8e
RS
1224
1225@example
1226@group
1227(or (pos-visible-in-window-p
1228 (point) (selected-window))
1229 (recenter 0))
1230@end group
1231@end example
b1b12a8e
RS
1232@end defun
1233
8241495d
RS
1234@node Textual Scrolling
1235@section Textual Scrolling
1236@cindex textual scrolling
1237@cindex scrolling textually
1238
1239 @dfn{Textual scrolling} means moving the text up or down though a
1240window. It works by changing the value of the window's display-start
1241location. It may also change the value of @code{window-point} to keep
1242point on the screen.
b1b12a8e 1243
8241495d
RS
1244 Textual scrolling was formerly called ``vertical scrolling,'' but we
1245changed its name to distinguish it from the new vertical fractional
1246scrolling feature (@pxref{Vertical Scrolling}).
b1b12a8e
RS
1247
1248 In the commands @code{scroll-up} and @code{scroll-down}, the directions
1249``up'' and ``down'' refer to the motion of the text in the buffer at which
1250you are looking through the window. Imagine that the text is
1251written on a long roll of paper and that the scrolling commands move the
1252paper up and down. Thus, if you are looking at text in the middle of a
1253buffer and repeatedly call @code{scroll-down}, you will eventually see
1254the beginning of the buffer.
1255
1256 Some people have urged that the opposite convention be used: they
1257imagine that the window moves over text that remains in place. Then
1258``down'' commands would take you to the end of the buffer. This view is
1259more consistent with the actual relationship between windows and the
1260text in the buffer, but it is less like what the user sees. The
1261position of a window on the terminal does not move, and short scrolling
1262commands clearly move the text up or down on the screen. We have chosen
1263names that fit the user's point of view.
1264
8241495d
RS
1265 The textual scrolling functions (aside from
1266@code{scroll-other-window}) have unpredictable results if the current
1267buffer is different from the buffer that is displayed in the selected
1268window. @xref{Current Buffer}.
b1b12a8e
RS
1269
1270@deffn Command scroll-up &optional count
1271This function scrolls the text in the selected window upward
1272@var{count} lines. If @var{count} is negative, scrolling is actually
1273downward.
1274
1275If @var{count} is @code{nil} (or omitted), then the length of scroll
1276is @code{next-screen-context-lines} lines less than the usable height of
1277the window (not counting its mode line).
1278
1279@code{scroll-up} returns @code{nil}.
1280@end deffn
1281
1282@deffn Command scroll-down &optional count
1283This function scrolls the text in the selected window downward
1284@var{count} lines. If @var{count} is negative, scrolling is actually
1285upward.
1286
1287If @var{count} is omitted or @code{nil}, then the length of the scroll
1288is @code{next-screen-context-lines} lines less than the usable height of
c638661f 1289the window (not counting its mode line).
b1b12a8e
RS
1290
1291@code{scroll-down} returns @code{nil}.
1292@end deffn
1293
1294@deffn Command scroll-other-window &optional count
1295This function scrolls the text in another window upward @var{count}
1296lines. Negative values of @var{count}, or @code{nil}, are handled
1297as in @code{scroll-up}.
1298
8241495d
RS
1299You can specify which buffer to scroll by setting the variable
1300@code{other-window-scroll-buffer} to a buffer. If that buffer isn't
1301already displayed, @code{scroll-other-window} displays it in some
1302window.
1303
1304When the selected window is the minibuffer, the next window is normally
1305the one at the top left corner. You can specify a different window to
1306scroll, when the minibuffer is selected, by setting the variable
b1b12a8e
RS
1307@code{minibuffer-scroll-window}. This variable has no effect when any
1308other window is selected. @xref{Minibuffer Misc}.
1309
1310When the minibuffer is active, it is the next window if the selected
1311window is the one at the bottom right corner. In this case,
1312@code{scroll-other-window} attempts to scroll the minibuffer. If the
1313minibuffer contains just one line, it has nowhere to scroll to, so the
1314line reappears after the echo area momentarily displays the message
1315``Beginning of buffer''.
1316@end deffn
1317
1318@c Emacs 19 feature
1319@defvar other-window-scroll-buffer
1320If this variable is non-@code{nil}, it tells @code{scroll-other-window}
1321which buffer to scroll.
1322@end defvar
1323
1911e6e5
RS
1324@defopt scroll-margin
1325This option specifies the size of the scroll margin---a minimum number
1326of lines between point and the top or bottom of a window. Whenever
1327point gets within this many lines of the top or bottom of the window,
1328the window scrolls automatically (if possible) to move point out of the
1329margin, closer to the center of the window.
1330@end defopt
1331
1911e6e5 1332@defopt scroll-conservatively
b1b12a8e 1333This variable controls how scrolling is done automatically when point
1911e6e5
RS
1334moves off the screen (or into the scroll margin). If the value is zero,
1335then redisplay scrolls the text to center point vertically in the
1336window. If the value is a positive integer @var{n}, then redisplay
1337scrolls the window up to @var{n} lines in either direction, if that will
1338bring point back into view. Otherwise, it centers point. The default
1339value is zero.
765712a7
GM
1340
1341A value of @code{nil} is equivalent to .5, since it centers point. This
1342variable automatically becomes buffer-local when set in any fashion.
1911e6e5
RS
1343@end defopt
1344
04c1025b
GM
1345@defopt scroll-up-aggressively
1346@tindex scroll-up-aggressively
1347The value of this variable should be either @code{nil} or a fraction
1348@var{f} between 0 and 1. If it is a fraction, that specifies where on
1349the screen to put point when scrolling upward. More precisely, when a
1350window scrolls up because point is above the window start, the new start
1351position is chosen to put point @var{f} part of the window height from
1352the top. The larger @var{f}, the more aggressive the scrolling.
1353
2468d0c0
DL
1354A value of @code{nil} is equivalent to .5, since its effect is to center
1355point. This variable automatically becomes buffer-local when set in any
1356fashion.
04c1025b
GM
1357@end defopt
1358
1359@defopt scroll-down-aggressively
1360@tindex scroll-down-aggressively
1361Likewise, for scrolling down. The value, @var{f}, specifies how far
1362point should be placed from the bottom of the window; thus, as with
1363@code{scroll-up-aggressively}, a larger value scrolls more aggressively.
1364@end defopt
1365
1911e6e5
RS
1366@defopt scroll-step
1367This variable is an older variant of @code{scroll-conservatively}. The
1368difference is that it if its value is @var{n}, that permits scrolling
1369only by precisely @var{n} lines, not a smaller number. This feature
1370does not work with @code{scroll-margin}. The default value is zero.
1371@end defopt
1372
1911e6e5
RS
1373@defopt scroll-preserve-screen-position
1374If this option is non-@code{nil}, the scroll functions move point so
1375that the vertical position of the cursor is unchanged, when that is
1376possible.
b1b12a8e
RS
1377@end defopt
1378
1379@defopt next-screen-context-lines
1380The value of this variable is the number of lines of continuity to
1381retain when scrolling by full screens. For example, @code{scroll-up}
1382with an argument of @code{nil} scrolls so that this many lines at the
1383bottom of the window appear instead at the top. The default value is
1384@code{2}.
1385@end defopt
1386
1387@deffn Command recenter &optional count
1388@cindex centering point
1389This function scrolls the selected window to put the text where point
1390is located at a specified vertical position within the window.
1391
1392If @var{count} is a nonnegative number, it puts the line containing
1393point @var{count} lines down from the top of the window. If @var{count}
1394is a negative number, then it counts upward from the bottom of the
1395window, so that @minus{}1 stands for the last usable line in the window.
1396If @var{count} is a non-@code{nil} list, then it stands for the line in
1397the middle of the window.
1398
1399If @var{count} is @code{nil}, @code{recenter} puts the line containing
1400point in the middle of the window, then clears and redisplays the entire
1401selected frame.
1402
1403When @code{recenter} is called interactively, @var{count} is the raw
1404prefix argument. Thus, typing @kbd{C-u} as the prefix sets the
1405@var{count} to a non-@code{nil} list, while typing @kbd{C-u 4} sets
1406@var{count} to 4, which positions the current line four lines from the
1407top.
1408
c638661f
RS
1409With an argument of zero, @code{recenter} positions the current line at
1410the top of the window. This action is so handy that some people make a
1411separate key binding to do this. For example,
b1b12a8e
RS
1412
1413@example
1414@group
1415(defun line-to-top-of-window ()
1416 "Scroll current line to top of window.
1417Replaces three keystroke sequence C-u 0 C-l."
3c29caa8 1418 (interactive)
b1b12a8e
RS
1419 (recenter 0))
1420
3c29caa8 1421(global-set-key [kp-multiply] 'line-to-top-of-window)
b1b12a8e
RS
1422@end group
1423@end example
1424@end deffn
1425
8241495d
RS
1426@node Vertical Scrolling
1427@section Vertical Fractional Scrolling
1428@cindex Vertical Fractional Scrolling
1429
1430 @dfn{Vertical fractional scrolling} means shifting the image in the
1431window up or down by a specified multiple or fraction of a line.
1432Starting in Emacs 21, each window has a @dfn{vertical scroll position},
1433which is a number, never less than zero. It specifies how far to raise
1434the contents of the window. Raising the window contents generally makes
1435all or part of some lines disappear off the top, and all or part of some
1436other lines appear at the bottom. The usual value is zero.
1437
1438 The vertical scroll position is measured in units of the normal line
1439height, which is the height of the default font. Thus, if the value is
1440.5, that means the window contents are scrolled up half the normal line
1441height. If it is 3.3, that means the window contents are scrolled up
1442somewhat over three times the normal line height.
1443
1444 What fraction of a line the vertical scrolling covers, or how many
1445lines, depends on what the lines contain. A value of .5 could scroll a
1446line whose height is very short off the screen, while a value of 3.3
1447could scroll just part of the way through a tall line or an image.
1448
1449@defun window-vscroll &optional window
1450This function returns the current vertical scroll position of
1451@var{window}, If @var{window} is @code{nil}, the selected window is
1452used.
1453
1454@example
1455@group
1456(window-vscroll)
1457 @result{} 0
1458@end group
1459@end example
1460@end defun
1461
1462@defun set-window-vscroll window lines
1463This function sets @var{window}'s vertical scroll position to
1464@var{lines}. The argument @var{lines} should be zero or positive; if
1465not, it is taken as zero.
1466
1467The actual vertical scroll position must always correspond
1468to an integral number of pixels, so the value you specify
1469is rounded accordingly.
1470
1471The return value is the result of this rounding.
1472
1473@example
1474@group
1475(set-window-vscroll (selected-window) 1.2)
1476 @result{} 1.13
1477@end group
1478@end example
1479@end defun
1480
b1b12a8e
RS
1481@node Horizontal Scrolling
1482@section Horizontal Scrolling
1483@cindex horizontal scrolling
1484
8241495d
RS
1485 @dfn{Horizontal scrolling} means shifting the image in the window left
1486or right by a specified multiple of the normal character width. Each
1487window has a @dfn{vertical scroll position}, which is a number, never
1488less than zero. It specifies how far to shift the contents left.
1489Shifting the window contents left generally makes all or part of some
1490characters disappear off the left, and all or part of some other
1491characters appear at the right. The usual value is zero.
1492
1493 The horizontal scroll position is measured in units of the normal
1494character width, which is the width of space in the default font. Thus,
1495if the value is 5, that means the window contents are scrolled left by 5
c400241b 1496times the normal character width. How many characters actually
8241495d
RS
1497disappear off to the left depends on their width, and could vary from
1498line to line.
1499
1500 Because we read from side to side in the ``inner loop'', and from top
1501to bottom in the ``outer loop'', the effect of horizontal scrolling is
1502not like that of textual or vertical scrolling. Textual scrolling
1503involves selection of a portion of text to display, and vertical
1504scrolling moves the window contents contiguously; but horizontal
1505scrolling causes part of @emph{each line} to go off screen.
b1b12a8e
RS
1506
1507 Usually, no horizontal scrolling is in effect; then the leftmost
1508column is at the left edge of the window. In this state, scrolling to
8241495d
RS
1509the right is meaningless, since there is no data to the left of the edge
1510to be revealed by it; so this is not allowed. Scrolling to the left is
1511allowed; it scrolls the first columns of text off the edge of the window
1512and can reveal additional columns on the right that were truncated
1513before. Once a window has a nonzero amount of leftward horizontal
1514scrolling, you can scroll it back to the right, but only so far as to
1515reduce the net horizontal scroll to zero. There is no limit to how far
1516left you can scroll, but eventually all the text will disappear off the
1517left edge.
1518
1519 In Emacs 21, redisplay automatically alters the horizontal scrolling
03ff8aab
GM
1520of a window as necessary to ensure that point is always visible, if
1521@code{automatic-hscrolling} is set. However, you can still set the
1522horizontal scrolling value explicitly. The value you specify serves as
1523a lower bound for automatic scrolling, i.e. automatic scrolling
1524will not scroll a window to a column less than the specified one.
8241495d
RS
1525
1526@deffn Command scroll-left &optional count
b1b12a8e 1527This function scrolls the selected window @var{count} columns to the
8241495d
RS
1528left (or to the right 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@end deffn
1535
8241495d 1536@deffn Command scroll-right &optional count
b1b12a8e 1537This function scrolls the selected window @var{count} columns to the
8241495d
RS
1538right (or to the left if @var{count} is negative). The default
1539for @var{count} is the window width, minus 2.
1540
1541The return value is the total amount of leftward horizontal scrolling in
1542effect after the change---just like the value returned by
1543@code{window-hscroll} (below).
b1b12a8e
RS
1544
1545Once you scroll a window as far right as it can go, back to its normal
1546position where the total leftward scrolling is zero, attempts to scroll
1547any farther right have no effect.
1548@end deffn
1549
1550@defun window-hscroll &optional window
1551This function returns the total leftward horizontal scrolling of
1552@var{window}---the number of columns by which the text in @var{window}
1553is scrolled left past the left margin.
1554
1555The value is never negative. It is zero when no horizontal scrolling
1556has been done in @var{window} (which is usually the case).
1557
1558If @var{window} is @code{nil}, the selected window is used.
1559
1560@example
1561@group
1562(window-hscroll)
1563 @result{} 0
1564@end group
1565@group
1566(scroll-left 5)
1567 @result{} 5
1568@end group
1569@group
1570(window-hscroll)
1571 @result{} 5
1572@end group
1573@end example
1574@end defun
1575
1576@defun set-window-hscroll window columns
1577This function sets the number of columns from the left margin that
f9f59935 1578@var{window} is scrolled from the value of @var{columns}. The argument
b1b12a8e 1579@var{columns} should be zero or positive; if not, it is taken as zero.
8241495d 1580Fractional values of @var{columns} are not supported at present.
b1b12a8e
RS
1581
1582The value returned is @var{columns}.
1583
1584@example
1585@group
1586(set-window-hscroll (selected-window) 10)
1587 @result{} 10
1588@end group
1589@end example
1590@end defun
1591
1592 Here is how you can determine whether a given position @var{position}
1593is off the screen due to horizontal scrolling:
1594
1595@example
1596@group
c638661f 1597(defun hscroll-on-screen (window position)
3c29caa8 1598 (save-excursion
c638661f 1599 (goto-char position)
3c29caa8 1600 (and
c638661f
RS
1601 (>= (- (current-column) (window-hscroll window)) 0)
1602 (< (- (current-column) (window-hscroll window))
1603 (window-width window)))))
b1b12a8e
RS
1604@end group
1605@end example
1606
1607@node Size of Window
1608@section The Size of a Window
1609@cindex window size
1610@cindex size of window
1611
1612 An Emacs window is rectangular, and its size information consists of
1613the height (the number of lines) and the width (the number of character
1614positions in each line). The mode line is included in the height. But
1615the width does not count the scroll bar or the column of @samp{|}
c638661f 1616characters that separates side-by-side windows.
b1b12a8e
RS
1617
1618 The following three functions return size information about a window:
1619
1620@defun window-height &optional window
969fe9b5
RS
1621This function returns the number of lines in @var{window}, including its
1622mode line. If @var{window} fills its entire frame, this is typically
1623one less than the value of @code{frame-height} on that frame (since the
1624last line is always reserved for the minibuffer).
b1b12a8e
RS
1625
1626If @var{window} is @code{nil}, the function uses the selected window.
1627
1628@example
1629@group
1630(window-height)
1631 @result{} 23
1632@end group
1633@group
1634(split-window-vertically)
1635 @result{} #<window 4 on windows.texi>
1636@end group
1637@group
1638(window-height)
1639 @result{} 11
1640@end group
1641@end example
1642@end defun
1643
1644@defun window-width &optional window
1645This function returns the number of columns in @var{window}. If
1646@var{window} fills its entire frame, this is the same as the value of
1647@code{frame-width} on that frame. The width does not include the
1648window's scroll bar or the column of @samp{|} characters that separates
1649side-by-side windows.
1650
1651If @var{window} is @code{nil}, the function uses the selected window.
1652
1653@example
1654@group
1655(window-width)
1656 @result{} 80
1657@end group
1658@end example
1659@end defun
1660
1661@defun window-edges &optional window
1662This function returns a list of the edge coordinates of @var{window}.
1663If @var{window} is @code{nil}, the selected window is used.
1664
1665The order of the list is @code{(@var{left} @var{top} @var{right}
1666@var{bottom})}, all elements relative to 0, 0 at the top left corner of
1667the frame. The element @var{right} of the value is one more than the
1668rightmost column used by @var{window}, and @var{bottom} is one more than
1669the bottommost row used by @var{window} and its mode-line.
1670
8241495d
RS
1671If a window has a scroll bar, the right edge value includes the width of
1672the scroll bar. Otherwise, if the window has a neighbor on the right,
1673its right edge value includes the width of the separator line between
1674the window and that neighbor. Since the width of the window does not
1675include this separator, the width does not usually equal the difference
1676between the right and left edges.
b1b12a8e
RS
1677
1678Here is the result obtained on a typical 24-line terminal with just one
1679window:
1680
1681@example
1682@group
1683(window-edges (selected-window))
1684 @result{} (0 0 80 23)
1685@end group
1686@end example
1687
c638661f
RS
1688@noindent
1689The bottom edge is at line 23 because the last line is the echo area.
1690
fb1d9004
RS
1691If @var{window} is at the upper left corner of its frame, then
1692@var{bottom} is the same as the value of @code{(window-height)},
8241495d
RS
1693@var{right} is almost the same as the value of @code{(window-width)},
1694and @var{top} and @var{left} are zero. For example, the edges of the
1695following window are @w{@samp{0 0 8 5}}. Assuming that the frame has
1696more than 8 columns, the last column of the window (column 7) holds a
1697border rather than text. The last row (row 4) holds the mode line,
1698shown here with @samp{xxxxxxxxx}.
b1b12a8e
RS
1699
1700@example
1701@group
3c29caa8 1702 0
b1b12a8e 1703 _______
3c29caa8
DH
1704 0 | |
1705 | |
1706 | |
1707 | |
b1b12a8e
RS
1708 xxxxxxxxx 4
1709
3c29caa8 1710 7
b1b12a8e
RS
1711@end group
1712@end example
1713
b1b12a8e
RS
1714In the following example, let's suppose that the frame is 7
1715columns wide. Then the edges of the left window are @w{@samp{0 0 4 3}}
8241495d 1716and the edges of the right window are @w{@samp{4 0 8 3}}.
b1b12a8e
RS
1717
1718@example
1719@group
1720 ___ ___
3c29caa8
DH
1721 | | |
1722 | | |
1723 xxxxxxxxx
b1b12a8e
RS
1724
1725 0 34 7
1726@end group
1727@end example
1728@end defun
1729
1730@node Resizing Windows
1731@section Changing the Size of a Window
1732@cindex window resizing
1733@cindex changing window size
1734@cindex window size, changing
1735
1736 The window size functions fall into two classes: high-level commands
1737that change the size of windows and low-level functions that access
1738window size. Emacs does not permit overlapping windows or gaps between
1739windows, so resizing one window affects other windows.
1740
1741@deffn Command enlarge-window size &optional horizontal
c638661f 1742This function makes the selected window @var{size} lines taller,
b1b12a8e
RS
1743stealing lines from neighboring windows. It takes the lines from one
1744window at a time until that window is used up, then takes from another.
1745If a window from which lines are stolen shrinks below
1746@code{window-min-height} lines, that window disappears.
1747
1748If @var{horizontal} is non-@code{nil}, this function makes
1749@var{window} wider by @var{size} columns, stealing columns instead of
1750lines. If a window from which columns are stolen shrinks below
1751@code{window-min-width} columns, that window disappears.
1752
c638661f
RS
1753If the requested size would exceed that of the window's frame, then the
1754function makes the window occupy the entire height (or width) of the
1755frame.
b1b12a8e 1756
8241495d
RS
1757If there are various other windows from which lines or columns can be
1758stolen, and some of them specify fixed size (using
1759@code{window-size-fixed}, see below), they are left untouched while
1760other windows are ``robbed.'' If it would be necessary to alter the
1761size of a fixed-size window, @code{enlarge-window} gets an error
1762instead.
1763
b1b12a8e
RS
1764If @var{size} is negative, this function shrinks the window by
1765@minus{}@var{size} lines or columns. If that makes the window smaller
1766than the minimum size (@code{window-min-height} and
1767@code{window-min-width}), @code{enlarge-window} deletes the window.
1768
3c29caa8 1769@code{enlarge-window} returns @code{nil}.
b1b12a8e
RS
1770@end deffn
1771
1772@deffn Command enlarge-window-horizontally columns
1773This function makes the selected window @var{columns} wider.
1774It could be defined as follows:
1775
1776@example
1777@group
1778(defun enlarge-window-horizontally (columns)
1779 (enlarge-window columns t))
1780@end group
1781@end example
1782@end deffn
1783
1784@deffn Command shrink-window size &optional horizontal
1785This function is like @code{enlarge-window} but negates the argument
1786@var{size}, making the selected window smaller by giving lines (or
1787columns) to the other windows. If the window shrinks below
1788@code{window-min-height} or @code{window-min-width}, then it disappears.
1789
1790If @var{size} is negative, the window is enlarged by @minus{}@var{size}
1791lines or columns.
1792@end deffn
1793
1794@deffn Command shrink-window-horizontally columns
1795This function makes the selected window @var{columns} narrower.
1796It could be defined as follows:
1797
1798@example
1799@group
1800(defun shrink-window-horizontally (columns)
1801 (shrink-window columns t))
1802@end group
1803@end example
1804@end deffn
1805
8241495d 1806@deffn Command shrink-window-if-larger-than-buffer &optional window
1911e6e5
RS
1807This command shrinks @var{window} to be as small as possible while still
1808showing the full contents of its buffer---but not less than
8241495d
RS
1809@code{window-min-height} lines. If @var{window} is not given,
1810it defaults to the selected window.
1911e6e5
RS
1811
1812However, the command does nothing if the window is already too small to
1813display the whole text of the buffer, or if part of the contents are
1814currently scrolled off screen, or if the window is not the full width of
1815its frame, or if the window is the only window in its frame.
1816@end deffn
1817
8241495d
RS
1818@tindex window-size-fixed
1819@defvar window-size-fixed
1820If this variable is non-@code{nil}, in any given buffer,
1821then the size of any window displaying the buffer remains fixed
1822unless you explicitly change it or Emacs has no other choice.
1823(This feature is new in Emacs 21.)
1824
1825If the value is @code{height}, then only the window's height is fixed;
1826if the value is @code{width}, then only the window's width is fixed.
1827Any other non-@code{nil} value fixes both the width and the height.
1828
1829The usual way to use this variable is to give it a buffer-local value in
1830a particular buffer. That way, the windows (but usually there is only
1831one) displaying that buffer have fixed size.
1832
1833Explicit size-change functions such as @code{enlarge-window}
1834get an error if they would have to change a window size which is fixed.
1835Therefore, when you want to change the size of such a window,
1836you should bind @code{window-size-fixed} to @code{nil}, like this:
1837
1838@example
1839(let ((window-size-fixed nil))
1840 (enlarge-window 10))
1841@end example
1842
1843Note that changing the frame size will change the size of a
1844fixed-size window, if there is no other alternative.
1845@end defvar
1846
b1b12a8e 1847@cindex minimum window size
c638661f 1848 The following two variables constrain the window-size-changing
b1b12a8e
RS
1849functions to a minimum height and width.
1850
1851@defopt window-min-height
1852The value of this variable determines how short a window may become
1853before it is automatically deleted. Making a window smaller than
1854@code{window-min-height} automatically deletes it, and no window may be
1855created shorter than this. The absolute minimum height is two (allowing
1856one line for the mode line, and one line for the buffer display).
c638661f 1857Actions that change window sizes reset this variable to two if it is
b1b12a8e
RS
1858less than two. The default value is 4.
1859@end defopt
1860
1861@defopt window-min-width
1862The value of this variable determines how narrow a window may become
1911e6e5 1863before it is automatically deleted. Making a window smaller than
b1b12a8e
RS
1864@code{window-min-width} automatically deletes it, and no window may be
1865created narrower than this. The absolute minimum width is one; any
1866value below that is ignored. The default value is 10.
1867@end defopt
1868
1869@node Coordinates and Windows
1870@section Coordinates and Windows
1871
c638661f 1872This section describes how to relate screen coordinates to windows.
b1b12a8e
RS
1873
1874@defun window-at x y &optional frame
1875This function returns the window containing the specified cursor
1876position in the frame @var{frame}. The coordinates @var{x} and @var{y}
1877are measured in characters and count from the top left corner of the
1878frame. If they are out of range, @code{window-at} returns @code{nil}.
1879
1880If you omit @var{frame}, the selected frame is used.
1881@end defun
1882
1883@defun coordinates-in-window-p coordinates window
1884This function checks whether a particular frame position falls within
1885the window @var{window}.
1886
969fe9b5
RS
1887The argument @var{coordinates} is a cons cell of the form @code{(@var{x}
1888. @var{y})}. The coordinates @var{x} and @var{y} are measured in
1889characters, and count from the top left corner of the screen or frame.
b1b12a8e 1890
f9f59935
RS
1891The value returned by @code{coordinates-in-window-p} is non-@code{nil}
1892if the coordinates are inside @var{window}. The value also indicates
1893what part of the window the position is in, as follows:
b1b12a8e
RS
1894
1895@table @code
1896@item (@var{relx} . @var{rely})
1897The coordinates are inside @var{window}. The numbers @var{relx} and
1898@var{rely} are the equivalent window-relative coordinates for the
1899specified position, counting from 0 at the top left corner of the
1900window.
1901
1902@item mode-line
1903The coordinates are in the mode line of @var{window}.
1904
8241495d
RS
1905@item header-line
1906The coordinates are in the header line of @var{window}.
1907
1908@item vertical-line
b1b12a8e 1909The coordinates are in the vertical line between @var{window} and its
3c29caa8 1910neighbor to the right. This value occurs only if the window doesn't
b1b12a8e 1911have a scroll bar; positions in a scroll bar are considered outside the
8241495d 1912window for these purposes.
b1b12a8e
RS
1913
1914@item nil
1915The coordinates are not in any part of @var{window}.
1916@end table
1917
1918The function @code{coordinates-in-window-p} does not require a frame as
1919argument because it always uses the frame that @var{window} is on.
1920@end defun
1921
1922@node Window Configurations
1923@section Window Configurations
1924@cindex window configurations
1925@cindex saving window information
1926
f9f59935 1927 A @dfn{window configuration} records the entire layout of one
b1b12a8e
RS
1928frame---all windows, their sizes, which buffers they contain, what part
1929of each buffer is displayed, and the values of point and the mark. You
1930can bring back an entire previous layout by restoring a window
1931configuration previously saved.
1932
1933 If you want to record all frames instead of just one, use a frame
1934configuration instead of a window configuration. @xref{Frame
1935Configurations}.
1936
8241495d
RS
1937@defun current-window-configuration &optional frame
1938This function returns a new object representing @var{frame}'s
f9f59935
RS
1939current window configuration, including the number of windows, their
1940sizes and current buffers, which window is the selected window, and for
1941each window the displayed buffer, the display-start position, and the
969fe9b5
RS
1942positions of point and the mark. It also includes the values of
1943@code{window-min-height}, @code{window-min-width} and
1944@code{minibuffer-scroll-window}. An exception is made for point in the
f9f59935 1945current buffer, whose value is not saved.
8241495d
RS
1946
1947If @var{frame} is omitted, the selected frame is used.
b1b12a8e
RS
1948@end defun
1949
1950@defun set-window-configuration configuration
f9f59935 1951This function restores the configuration of windows and buffers as
8241495d
RS
1952specified by @var{configuration}, for the frame that @var{configuration}
1953was created for.
1954
1955The argument @var{configuration} must be a value that was previously
1956returned by @code{current-window-configuration}. This configuration is
1957restored in the frame from which @var{configuration} was made, whether
1958that frame is selected or not. This always counts as a window size
1959change and triggers execution of the @code{window-size-change-functions}
969fe9b5
RS
1960(@pxref{Window Hooks}), because @code{set-window-configuration} doesn't
1961know how to tell whether the new configuration actually differs from the
1962old one.
1963
1964If the frame which @var{configuration} was saved from is dead, all this
1965function does is restore the three variables @code{window-min-height},
1966@code{window-min-width} and @code{minibuffer-scroll-window}.
bfe721d1 1967
b1b12a8e
RS
1968Here is a way of using this function to get the same effect
1969as @code{save-window-excursion}:
1970
1971@example
1972@group
1973(let ((config (current-window-configuration)))
1974 (unwind-protect
1975 (progn (split-window-vertically nil)
1976 @dots{})
1977 (set-window-configuration config)))
1978@end group
1979@end example
1980@end defun
1981
1982@defspec save-window-excursion forms@dots{}
1983This special form records the window configuration, executes @var{forms}
1984in sequence, then restores the earlier window configuration. The window
1985configuration includes the value of point and the portion of the buffer
c638661f 1986that is visible. It also includes the choice of selected window.
b1b12a8e 1987However, it does not include the value of point in the current buffer;
f9f59935 1988use @code{save-excursion} also, if you wish to preserve that.
b1b12a8e 1989
bfe721d1
KH
1990Don't use this construct when @code{save-selected-window} is all you need.
1991
1992Exit from @code{save-window-excursion} always triggers execution of the
1993@code{window-size-change-functions}. (It doesn't know how to tell
1994whether the restored configuration actually differs from the one in
1995effect at the end of the @var{forms}.)
1996
b1b12a8e
RS
1997The return value is the value of the final form in @var{forms}.
1998For example:
1999
2000@example
2001@group
2002(split-window)
2003 @result{} #<window 25 on control.texi>
2004@end group
2005@group
2006(setq w (selected-window))
2007 @result{} #<window 19 on control.texi>
2008@end group
2009@group
2010(save-window-excursion
2011 (delete-other-windows w)
2012 (switch-to-buffer "foo")
2013 'do-something)
2014 @result{} do-something
2015 ;; @r{The screen is now split again.}
2016@end group
2017@end example
2018@end defspec
2019
2020@defun window-configuration-p object
2021This function returns @code{t} if @var{object} is a window configuration.
969fe9b5
RS
2022@end defun
2023
2024@defun compare-window-configurations config1 config2
2025This function compares two window configurations as regards the
2026structure of windows, but ignores the values of point and mark and the
2027saved scrolling positions---it can return @code{t} even if those
2028aspects differ.
2029
2030The function @code{equal} can also compare two window configurations; it
2031regards configurations as unequal if they differ in any respect, even a
2032saved point or mark.
b1b12a8e
RS
2033@end defun
2034
2035 Primitives to look inside of window configurations would make sense,
2036but none are implemented. It is not clear they are useful enough to be
2037worth implementing.
f9f59935
RS
2038
2039@node Window Hooks
2040@section Hooks for Window Scrolling and Changes
2041
2042This section describes how a Lisp program can take action whenever a
2043window displays a different part of its buffer or a different buffer.
2044There are three actions that can change this: scrolling the window,
2045switching buffers in the window, and changing the size of the window.
2046The first two actions run @code{window-scroll-functions}; the last runs
2047@code{window-size-change-functions}. The paradigmatic use of these
969fe9b5
RS
2048hooks is in the implementation of Lazy Lock mode; see @ref{Support
2049Modes, Lazy Lock, Font Lock Support Modes, emacs, The GNU Emacs Manual}.
f9f59935
RS
2050
2051@defvar window-scroll-functions
2052This variable holds a list of functions that Emacs should call before
2053redisplaying a window with scrolling. It is not a normal hook, because
2054each function is called with two arguments: the window, and its new
2055display-start position.
2056
2057Displaying a different buffer in the window also runs these functions.
2058
1911e6e5
RS
2059These functions must be careful in using @code{window-end}
2060(@pxref{Window Start}); if you need an up-to-date value, you must use
2061the @var{update} argument to ensure you get it.
f9f59935
RS
2062@end defvar
2063
2064@defvar window-size-change-functions
2065This variable holds a list of functions to be called if the size of any
2066window changes for any reason. The functions are called just once per
2067redisplay, and just once for each frame on which size changes have
2068occurred.
2069
2070Each function receives the frame as its sole argument. There is no
2071direct way to find out which windows on that frame have changed size, or
2072precisely how. However, if a size-change function records, at each
2073call, the existing windows and their sizes, it can also compare the
2074present sizes and the previous sizes.
2075
2076Creating or deleting windows counts as a size change, and therefore
2077causes these functions to be called. Changing the frame size also
2078counts, because it changes the sizes of the existing windows.
2079
2080It is not a good idea to use @code{save-window-excursion} (@pxref{Window
2081Configurations}) in these functions, because that always counts as a
2082size change, and it would cause these functions to be called over and
2083over. In most cases, @code{save-selected-window} (@pxref{Selecting
2084Windows}) is what you need here.
2085@end defvar
2086
f9f59935 2087@defvar redisplay-end-trigger-functions
1911e6e5 2088This abnormal hook is run whenever redisplay in a window uses text that
f9f59935
RS
2089extends past a specified end trigger position. You set the end trigger
2090position with the function @code{set-window-redisplay-end-trigger}. The
2091functions are called with two arguments: the window, and the end trigger
2092position. Storing @code{nil} for the end trigger position turns off the
2093feature, and the trigger value is automatically reset to @code{nil} just
2094after the hook is run.
2095@end defvar
2096
f9f59935
RS
2097@defun set-window-redisplay-end-trigger window position
2098This function sets @var{window}'s end trigger position at
2099@var{position}.
2100@end defun
2101
8241495d 2102@defun window-redisplay-end-trigger &optional window
f9f59935
RS
2103This function returns @var{window}'s current end trigger position.
2104@end defun
2105
f9f59935
RS
2106@defvar window-configuration-change-hook
2107A normal hook that is run every time you change the window configuration
2108of an existing frame. This includes splitting or deleting windows,
2109changing the sizes of windows, or displaying a different buffer in a
2110window. The frame whose window configuration has changed is the
2111selected frame when this hook runs.
2112@end defvar