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