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