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