]> code.delx.au - gnu-emacs/blob - lispref/windows.texi
(Fmouse_position--both definitions): Pass 0 for `insist'.
[gnu-emacs] / lispref / windows.texi
1 @c -*-texinfo-*-
2 @c This is part of the GNU Emacs Lisp Reference Manual.
3 @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
4 @c See the file elisp.texi for copying conditions.
5 @setfilename ../info/windows
6 @node Windows, Frames, Buffers, Top
7 @chapter Windows
8
9 This chapter describes most of the functions and variables related to
10 Emacs windows. See @ref{Display}, for information on how text is
11 displayed in windows.
12
13 @menu
14 * Basic Windows:: Basic information on using windows.
15 * Splitting Windows:: Splitting one window into two windows.
16 * Deleting Windows:: Deleting a window gives its space to other windows.
17 * Selecting Windows:: The selected window is the one that you edit in.
18 * Cyclic Window Ordering:: Moving around the existing windows.
19 * Buffers and Windows:: Each window displays the contents of a buffer.
20 * Displaying Buffers:: Higher-lever functions for displaying a buffer
21 and choosing a window for it.
22 * Choosing Window:: How to choose a window for displaying a buffer.
23 * Window Point:: Each window has its own location of point.
24 * Window Start:: The display-start position controls which text
25 is on-screen in the window.
26 * Vertical Scrolling:: Moving text up and down in the window.
27 * Horizontal Scrolling:: Moving text sideways on the window.
28 * Size of Window:: Accessing the size of a window.
29 * Resizing Windows:: Changing the size of a window.
30 * Coordinates and Windows::Converting coordinates to windows.
31 * Window Configurations:: Saving and restoring the state of the screen.
32 @end menu
33
34 @node Basic Windows
35 @section Basic Concepts of Emacs Windows
36 @cindex window
37 @cindex selected window
38
39 A @dfn{window} is the physical area of the screen in which a buffer is
40 displayed. The term is also used to refer to a Lisp object that
41 represents that screen area in Emacs Lisp. It should be
42 clear from the context which is meant.
43
44 There is always at least one window in any frame. In each frame, at
45 any time, one and only one window is designated as @dfn{selected within
46 the frame}. The frame's cursor appears in that window. There is also
47 one selected frame; and the window selected within that frame is
48 @dfn{the selected window}. The selected window's buffer is usually the
49 current buffer (except when @code{set-buffer} has been used).
50 @xref{Current Buffer}.
51
52 For practical purposes, a window exists only while it is displayed on the
53 terminal. Once removed from the display, the window is effectively
54 deleted and should not be used, @emph{even though there may still be
55 references to it} from other Lisp objects. Restoring a saved window
56 configuration is the only way for a window no longer on the screen to
57 come back to life. (@xref{Deleting Windows}.)
58
59 Each window has the following attributes:
60
61 @itemize @bullet
62 @item
63 containing frame
64
65 @item
66 window height
67
68 @item
69 window width
70
71 @item
72 window edges with respect to the screen or frame
73
74 @item
75 the buffer it displays
76
77 @item
78 position within the buffer at the upper left of the window
79
80 @item
81 amount of horizontal scrolling, in columns
82
83 @item
84 point
85
86 @item
87 the mark
88
89 @item
90 how recently the window was selected
91 @end itemize
92
93 @cindex multiple windows
94 Users create multiple windows so they can look at several buffers at
95 once. Lisp libraries use multiple windows for a variety of reasons, but
96 most often to give different views of the same information. In Rmail,
97 for example, you can move through a summary buffer in one window while
98 the other window shows messages one at a time as they are reached.
99
100 The meaning of ``window'' in Emacs is similar to what it means in the
101 context of general-purpose window systems such as X, but not identical.
102 The X Window System subdivides the screen into X windows; Emacs uses one
103 or more X windows, called @dfn{frames} in Emacs terminology, and
104 subdivides each of them into (nonoverlapping) Emacs windows. When you
105 use Emacs on an ordinary display terminal, Emacs subdivides the terminal
106 screen into Emacs windows.
107
108 @cindex terminal screen
109 @cindex screen of terminal
110 @cindex tiled windows
111 Most window systems support arbitrarily located overlapping windows.
112 In contrast, Emacs windows are @dfn{tiled}; they never overlap, and
113 together they fill the whole screen or frame. Because of the way
114 in which Emacs creates new windows and resizes them, you can't create
115 every conceivable tiling of windows on an Emacs frame. @xref{Splitting
116 Windows}, and @ref{Size of Window}.
117
118 @xref{Display}, for information on how the contents of the
119 window's buffer are displayed in the window.
120
121 @defun windowp object
122 This function returns @code{t} if @var{object} is a window.
123 @end defun
124
125 @node Splitting Windows
126 @section Splitting Windows
127 @cindex splitting windows
128 @cindex window splitting
129
130 The functions described here are the primitives used to split a window
131 into two windows. Two higher level functions sometimes split a window,
132 but not always: @code{pop-to-buffer} and @code{display-buffer}
133 (@pxref{Displaying Buffers}).
134
135 The functions described here do not accept a buffer as an argument.
136 The two ``halves'' of the split window initially display the same buffer
137 previously visible in the window that was split.
138
139 @deffn Command split-window &optional window size horizontal
140 This function splits @var{window} into two windows. The original
141 window @var{window} remains the selected window, but occupies only
142 part of its former screen area. The rest is occupied by a newly created
143 window which is returned as the value of this function.
144
145 If @var{horizontal} is non-@code{nil}, then @var{window} splits into
146 two side by side windows. The original window @var{window} keeps the
147 leftmost @var{size} columns, and gives the rest of the columns to the
148 new window. Otherwise, it splits into windows one above the other, and
149 @var{window} keeps the upper @var{size} lines and gives the rest of the
150 lines to the new window. The original window is therefore the
151 left-hand or upper of the two, and the new window is the right-hand or
152 lower.
153
154 If @var{window} is omitted or @code{nil}, then the selected window is
155 split. If @var{size} is omitted or @code{nil}, then @var{window} is
156 divided evenly into two parts. (If there is an odd line, it is
157 allocated to the new window.) When @code{split-window} is called
158 interactively, all its arguments are @code{nil}.
159
160 The following example starts with one window on a screen that is 50
161 lines high by 80 columns wide; then the window is split.
162
163 @smallexample
164 @group
165 (setq w (selected-window))
166 @result{} #<window 8 on windows.texi>
167 (window-edges) ; @r{Edges in order:}
168 @result{} (0 0 80 50) ; @r{left--top--right--bottom}
169 @end group
170
171 @group
172 ;; @r{Returns window created}
173 (setq w2 (split-window w 15))
174 @result{} #<window 28 on windows.texi>
175 @end group
176 @group
177 (window-edges w2)
178 @result{} (0 15 80 50) ; @r{Bottom window;}
179 ; @r{top is line 15}
180 @end group
181 @group
182 (window-edges w)
183 @result{} (0 0 80 15) ; @r{Top window}
184 @end group
185 @end smallexample
186
187 The screen looks like this:
188
189 @smallexample
190 @group
191 __________
192 | | line 0
193 | w |
194 |__________|
195 | | line 15
196 | w2 |
197 |__________|
198 line 50
199 column 0 column 80
200 @end group
201 @end smallexample
202
203 Next, the top window is split horizontally:
204
205 @smallexample
206 @group
207 (setq w3 (split-window w 35 t))
208 @result{} #<window 32 on windows.texi>
209 @end group
210 @group
211 (window-edges w3)
212 @result{} (35 0 80 15) ; @r{Left edge at column 35}
213 @end group
214 @group
215 (window-edges w)
216 @result{} (0 0 35 15) ; @r{Right edge at column 35}
217 @end group
218 @group
219 (window-edges w2)
220 @result{} (0 15 80 50) ; @r{Bottom window unchanged}
221 @end group
222 @end smallexample
223
224 Now, the screen looks like this:
225
226 @smallexample
227 @group
228 column 35
229 __________
230 | | | line 0
231 | w | w3 |
232 |___|______|
233 | | line 15
234 | w2 |
235 |__________|
236 line 50
237 column 0 column 80
238 @end group
239 @end smallexample
240
241 Normally, Emacs indicates the border between two side-by-side windows
242 with a scroll bar (@pxref{X Frame Parameters,Scroll Bars}) or @samp{|}
243 characters. The display table can specify alternative border
244 characters; see @ref{Display Tables}.
245 @end deffn
246
247 @deffn Command split-window-vertically size
248 This function splits the selected window into two windows, one above
249 the other, leaving the selected window with @var{size} lines.
250
251 This function is simply an interface to @code{split-windows}.
252 Here is the complete function definition for it:
253
254 @smallexample
255 @group
256 (defun split-window-vertically (&optional arg)
257 "Split current window into two windows, one above the other."
258 (interactive "P")
259 (split-window nil (and arg (prefix-numeric-value arg))))
260 @end group
261 @end smallexample
262 @end deffn
263
264 @deffn Command split-window-horizontally size
265 This function splits the selected window into two windows
266 side-by-side, leaving the selected window with @var{size} columns.
267
268 This function is simply an interface to @code{split-windows}. Here is
269 the complete definition for @code{split-window-horizontally} (except for
270 part of the documentation string):
271
272 @smallexample
273 @group
274 (defun split-window-horizontally (&optional arg)
275 "Split selected window into two windows, side by side..."
276 (interactive "P")
277 (split-window nil (and arg (prefix-numeric-value arg)) t))
278 @end group
279 @end smallexample
280 @end deffn
281
282 @defun one-window-p &optional no-mini all-frames
283 This function returns non-@code{nil} if there is only one window. The
284 argument @var{no-mini}, if non-@code{nil}, means don't count the
285 minibuffer even if it is active; otherwise, the minibuffer window is
286 included, if active, in the total number of windows, which is compared
287 against one.
288
289 The argument @var{all-frames} specifies which frames to consider. Here
290 are the possible values and their meanings:
291
292 @table @asis
293 @item @code{nil}
294 Count the windows in the selected frame, plus the minibuffer used
295 by that frame even if it lies in some other frame.
296
297 @item @code{t}
298 Count all windows in all existing frames.
299
300 @item @code{visible}
301 Count all windows in all visible frames.
302
303 @item anything else
304 Count precisely the windows in the selected frame, and no others.
305 @end table
306 @end defun
307
308 @node Deleting Windows
309 @section Deleting Windows
310 @cindex deleting windows
311
312 A window remains visible on its frame unless you @dfn{delete} it by
313 calling certain functions that delete windows. A deleted window cannot
314 appear on the screen, but continues to exist as a Lisp object until
315 there are no references to it. There is no way to cancel the deletion
316 of a window aside from restoring a saved window configuration
317 (@pxref{Window Configurations}). Restoring a window configuration also
318 deletes any windows that aren't part of that configuration.
319
320 When you delete a window, the space it took up is given to one
321 adjacent sibling. (In Emacs version 18, the space was divided evenly
322 among all the siblings.)
323
324 @c Emacs 19 feature
325 @defun window-live-p window
326 This function returns @code{nil} if @var{window} is deleted, and
327 @code{t} otherwise.
328
329 @strong{Warning:} Erroneous information or fatal errors may result from
330 using a deleted window as if it were live.
331 @end defun
332
333 @deffn Command delete-window &optional window
334 This function removes @var{window} from the display. If @var{window}
335 is omitted, then the selected window is deleted. An error is signaled
336 if there is only one window when @code{delete-window} is called.
337
338 This function returns @code{nil}.
339
340 When @code{delete-window} is called interactively, @var{window}
341 defaults to the selected window.
342 @end deffn
343
344 @deffn Command delete-other-windows &optional window
345 This function makes @var{window} the only window on its frame, by
346 deleting the other windows in that frame. If @var{window} is omitted or
347 @code{nil}, then the selected window is used by default.
348
349 The result is @code{nil}.
350 @end deffn
351
352 @deffn Command delete-windows-on buffer &optional frame
353 This function deletes all windows showing @var{buffer}. If there are
354 no windows showing @var{buffer}, it does nothing.
355
356 @code{delete-windows-on} operates frame by frame. If a frame has
357 several windows showing different buffers, then those showing
358 @var{buffer} are removed, and the others expand to fill the space. If
359 all windows in some frame are showing @var{buffer} (including the case
360 where there is only one window), then the frame reverts to having a
361 single window showing another buffer chosen with @code{other-buffer}.
362 @xref{The Buffer List}.
363
364 The argument @var{frame} controls which frames to operate on:
365
366 @itemize @bullet
367 @item
368 If it is @code{nil}, operate on the selected frame.
369 @item
370 If it is @code{t}, operate on all frames.
371 @item
372 If it is @code{visible}, operate on all visible frames.
373 @item
374 If it is a frame, operate on that frame.
375 @end itemize
376
377 This function always returns @code{nil}.
378 @end deffn
379
380 @node Selecting Windows
381 @section Selecting Windows
382 @cindex selecting windows
383
384 When a window is selected, the buffer in the window becomes the current
385 buffer, and the cursor will appear in it.
386
387 @defun selected-window
388 This function returns the selected window. This is the window in
389 which the cursor appears and to which many commands apply.
390 @end defun
391
392 @defun select-window window
393 This function makes @var{window} the selected window. The cursor then
394 appears in @var{window} (on redisplay). The buffer being displayed in
395 @var{window} is immediately designated the current buffer.
396
397 The return value is @var{window}.
398
399 @example
400 @group
401 (setq w (next-window))
402 (select-window w)
403 @result{} #<window 65 on windows.texi>
404 @end group
405 @end example
406 @end defun
407
408 @cindex finding windows
409 The following functions choose one of the windows on the screen,
410 offering various criteria for the choice.
411
412 @defun get-lru-window &optional frame
413 This function returns the window least recently ``used'' (that is,
414 selected). The selected window is always the most recently used window.
415
416 The selected window can be the least recently used window if it is the
417 only window. A newly created window becomes the least recently used
418 window until it is selected. A minibuffer window is never a candidate.
419
420 The argument @var{frame} controls which windows are considered.
421
422 @itemize @bullet
423 @item
424 If it is @code{nil}, consider windows on the selected frame.
425 @item
426 If it is @code{t}, consider windows on all frames.
427 @item
428 If it is @code{visible}, consider windows on all visible frames.
429 @item
430 If it is a frame, consider windows on that frame.
431 @end itemize
432 @end defun
433
434 @defun get-largest-window &optional frame
435 This function returns the window with the largest area (height times
436 width). If there are no side-by-side windows, then this is the window
437 with the most lines. A minibuffer window is never a candidate.
438
439 If there are two windows of the same size, then the function returns
440 the window that is first in the cyclic ordering of windows (see
441 following section), starting from the selected window.
442
443 The argument @var{frame} controls which set of windows are
444 considered. See @code{get-lru-window}, above.
445 @end defun
446
447 @node Cyclic Window Ordering
448 @comment node-name, next, previous, up
449 @section Cyclic Ordering of Windows
450 @cindex cyclic ordering of windows
451 @cindex ordering of windows, cyclic
452 @cindex window ordering, cyclic
453
454 When you use the command @kbd{C-x o} (@code{other-window}) to select
455 the next window, it moves through all the windows on the screen in a
456 specific cyclic order. For any given configuration of windows, this
457 order never varies. It is called the @dfn{cyclic ordering of windows}.
458
459 This ordering generally goes from top to bottom, and from left to
460 right. But it may go down first or go right first, depending on the
461 order in which the windows were split.
462
463 If the first split was vertical (into windows one above each other),
464 and then the subwindows were split horizontally, then the ordering is
465 left to right in the top of the frame, and then left to right in the
466 next lower part of the frame, and so on. If the first split was
467 horizontal, the ordering is top to bottom in the left part, and so on.
468 In general, within each set of siblings at any level in the window tree,
469 the order is left to right, or top to bottom.
470
471 @defun next-window &optional window minibuf all-frames
472 @cindex minibuffer window
473 This function returns the window following @var{window} in the cyclic
474 ordering of windows. This is the window that @kbd{C-x o} would select
475 if typed when @var{window} is selected. If @var{window} is the only
476 window visible, then this function returns @var{window}. If omitted,
477 @var{window} defaults to the selected window.
478
479 The value of the argument @var{minibuf} determines whether the
480 minibuffer is included in the window order. Normally, when
481 @var{minibuf} is @code{nil}, the minibuffer is included if it is
482 currently active; this is the behavior of @kbd{C-x o}. (The minibuffer
483 window is active while the minibuffer is in use. @xref{Minibuffers}.)
484
485 If @var{minibuf} is @code{t}, then the cyclic ordering includes the
486 minibuffer window even if it is not active.
487
488 If @var{minibuf} is neither @code{t} nor @code{nil}, then the minibuffer
489 window is not included even if it is active.
490
491 The argument @var{all-frames} specifies which frames to consider. Here
492 are the possible values and their meanings:
493
494 @table @asis
495 @item @code{nil}
496 Consider all the windows in @var{window}'s frame, plus the minibuffer
497 used by that frame even if it lies in some other frame.
498
499 @item @code{t}
500 Consider all windows in all existing frames.
501
502 @item @code{visible}
503 Consider all windows in all visible frames. (To get useful results, you
504 must ensure @var{window} is in a visible frame.)
505
506 @item anything else
507 Consider precisely the windows in @var{window}'s frame, and no others.
508 @end table
509
510 This example assumes there are two windows, both displaying the
511 buffer @samp{windows.texi}:
512
513 @example
514 @group
515 (selected-window)
516 @result{} #<window 56 on windows.texi>
517 @end group
518 @group
519 (next-window (selected-window))
520 @result{} #<window 52 on windows.texi>
521 @end group
522 @group
523 (next-window (next-window (selected-window)))
524 @result{} #<window 56 on windows.texi>
525 @end group
526 @end example
527 @end defun
528
529 @defun previous-window &optional window minibuf all-frames
530 This function returns the window preceding @var{window} in the cyclic
531 ordering of windows. The other arguments specify which windows to
532 include in the cycle, as in @code{next-window}.
533 @end defun
534
535 @deffn Command other-window count
536 This function selects the @var{count}th following window in the cyclic
537 order. If count is negative, then it selects the @minus{}@var{count}th
538 preceding window. It returns @code{nil}.
539
540 In an interactive call, @var{count} is the numeric prefix argument.
541 @end deffn
542
543 @c Emacs 19 feature
544 @defun walk-windows proc &optional minibuf all-frames
545 This function cycles through all windows, calling @code{proc}
546 once for each window with the window as its sole argument.
547
548 The optional arguments @var{minibuf} and @var{all-frames} specify the
549 set of windows to include in the scan. See @code{next-window}, above,
550 for details.
551 @end defun
552
553 @node Buffers and Windows
554 @section Buffers and Windows
555 @cindex examining windows
556 @cindex windows, controlling precisely
557 @cindex buffers, controlled in windows
558
559 This section describes low-level functions to examine windows or to
560 display buffers in windows in a precisely controlled fashion.
561 @iftex
562 See the following section for
563 @end iftex
564 @ifinfo
565 @xref{Displaying Buffers}, for
566 @end ifinfo
567 related functions that find a window to use and specify a buffer for it.
568 The functions described there are easier to use than these, but they
569 employ heuristics in choosing or creating a window; use these functions
570 when you need complete control.
571
572 @defun set-window-buffer window buffer-or-name
573 This function makes @var{window} display @var{buffer-or-name} as its
574 contents. It returns @code{nil}.
575
576 @example
577 @group
578 (set-window-buffer (selected-window) "foo")
579 @result{} nil
580 @end group
581 @end example
582 @end defun
583
584 @defun window-buffer &optional window
585 This function returns the buffer that @var{window} is displaying. If
586 @var{window} is omitted, this function returns the buffer for the
587 selected window.
588
589 @example
590 @group
591 (window-buffer)
592 @result{} #<buffer windows.texi>
593 @end group
594 @end example
595 @end defun
596
597 @defun get-buffer-window buffer-or-name &optional all-frames
598 This function returns a window currently displaying
599 @var{buffer-or-name}, or @code{nil} if there is none. If there are
600 several such windows, then the function returns the first one in the
601 cyclic ordering of windows, starting from the selected window.
602 @xref{Cyclic Window Ordering}.
603
604 The argument @var{all-frames} controls which windows to consider.
605
606 @itemize @bullet
607 @item
608 If it is @code{nil}, consider windows on the selected frame.
609 @item
610 If it is @code{t}, consider windows on all frames.
611 @item
612 If it is @code{visible}, consider windows on all visible frames.
613 @item
614 If it is a frame, consider windows on that frame.
615 @end itemize
616 @end defun
617
618 @deffn Command replace-buffer-in-windows buffer
619 This function replaces @var{buffer} with some other buffer in all
620 windows displaying it. The other buffer used is chosen with
621 @code{other-buffer}. In the usual applications of this function, you
622 don't care which other buffer is used; you just want to make sure that
623 @var{buffer} is no longer displayed.
624
625 This function returns @code{nil}.
626 @end deffn
627
628 @node Displaying Buffers
629 @section Displaying Buffers in Windows
630 @cindex switching to a buffer
631 @cindex displaying a buffer
632
633 In this section we describe convenient functions that choose a window
634 automatically and use it to display a specified buffer. These functions
635 can also split an existing window in certain circumstances. We also
636 describe variables that parameterize the heuristics used for choosing a
637 window.
638 @iftex
639 See the preceding section for
640 @end iftex
641 @ifinfo
642 @xref{Buffers and Windows}, for
643 @end ifinfo
644 low-level functions that give you more precise control.
645
646 Do not use the functions in this section in order to make a buffer
647 current so that a Lisp program can access or modify it; they are too
648 drastic for that purpose, since they change the display of buffers in
649 windows, which is gratuitous and will surprise the user. Instead, use
650 @code{set-buffer} (@pxref{Current Buffer}) and @code{save-excursion}
651 (@pxref{Excursions}), which designate buffers as current for programmed
652 access without affecting the display of buffers in windows.
653
654 @deffn Command switch-to-buffer buffer-or-name &optional norecord
655 This function makes @var{buffer-or-name} the current buffer, and also
656 displays the buffer in the selected window. This means that a human can
657 see the buffer and subsequent keyboard commands will apply to it.
658 Contrast this with @code{set-buffer}, which makes @var{buffer-or-name}
659 the current buffer but does not display it in the selected window.
660 @xref{Current Buffer}.
661
662 If @var{buffer-or-name} does not identify an existing buffer, then
663 a new buffer by that name is created.
664
665 Normally the specified buffer is put at the front of the buffer list.
666 This affects the operation of @code{other-buffer}. However, if
667 @var{norecord} is non-@code{nil}, this is not done. @xref{The Buffer
668 List}.
669
670 The @code{switch-to-buffer} function is often used interactively, as
671 the binding of @kbd{C-x b}. It is also used frequently in programs. It
672 always returns @code{nil}.
673 @end deffn
674
675 @deffn Command switch-to-buffer-other-window buffer-or-name
676 This function makes @var{buffer-or-name} the current buffer and
677 displays it in a window not currently selected. It then selects that
678 window. The handling of the buffer is the same as in
679 @code{switch-to-buffer}.
680
681 The currently selected window is absolutely never used to do the job.
682 If it is the only window, then it is split to make a distinct window for
683 this purpose. If the selected window is already displaying the buffer,
684 then it continues to do so, but another window is nonetheless found to
685 display it in as well.
686 @end deffn
687
688 @defun pop-to-buffer buffer-or-name &optional other-window
689 This function makes @var{buffer-or-name} the current buffer and
690 switches to it in some window, preferably not the window previously
691 selected. The ``popped-to'' window becomes the selected window within
692 its frame.
693
694 If the variable @code{pop-up-frames} is non-@code{nil},
695 @code{pop-to-buffer} looks for a window in any visible frame already
696 displaying the buffer; if there is one, it returns that window and makes
697 it be selected within its frame. If there is none, it creates a new
698 frame and displays the buffer in it.
699
700 If @code{pop-up-frames} is @code{nil}, then @code{pop-to-buffer}
701 operates entirely within the selected frame. (If the selected frame has
702 just a minibuffer, @code{pop-to-buffer} operates within the most
703 recently selected frame that was not just a minibuffer.)
704
705 If the variable @code{pop-up-windows} is non-@code{nil}, windows may
706 be split to create a new window that is different from the original
707 window. For details, see @ref{Choosing Window}.
708
709 If @var{other-window} is non-@code{nil}, @code{pop-to-buffer} finds or
710 creates another window even if @var{buffer-or-name} is already visible
711 in the selected window. Thus @var{buffer-or-name} could end up
712 displayed in two windows. On the other hand, if @var{buffer-or-name} is
713 already displayed in the selected window and @var{other-window} is
714 @code{nil}, then the selected window is considered sufficient display
715 for @var{buffer-or-name}, so that nothing needs to be done.
716
717 If @var{buffer-or-name} is a string that does not name an existing
718 buffer, a buffer by that name is created.
719 @end defun
720
721 @node Choosing Window
722 @section Choosing a Window for Display
723
724 This section describes the basic facility that chooses a window to
725 display a buffer in---@code{display-buffer}. All the higher-level
726 functions and commands use this subroutine. Here we describe how to use
727 @code{display-buffer} and how to customize it.
728
729 @deffn Command display-buffer buffer-or-name &optional not-this-window
730 This command makes @var{buffer-or-name} appear in some window, like
731 @code{pop-to-buffer}, but it does not select that window and does not
732 make the buffer current. The identity of the selected window is
733 unaltered by this function.
734
735 If @var{not-this-window} is non-@code{nil}, it means to display the
736 specified buffer in a window other than the selected one, even if it is
737 already on display in the selected window. This can cause the buffer to
738 appear in two windows at once. Otherwise, if @var{buffer-or-name} is
739 already being displayed in any window, that is good enough, so this
740 function does nothing.
741
742 @code{display-buffer} returns the window chosen to display
743 @var{buffer-or-name}.
744
745 Precisely how @code{display-buffer} finds or creates a window depends on
746 the variables described below.
747 @end deffn
748
749 @defopt pop-up-windows
750 This variable controls whether @code{display-buffer} makes new windows.
751 If it is non-@code{nil} and there is only one window, then that window
752 is split. If it is @code{nil}, then @code{display-buffer} does not
753 split the single window, but uses it whole.
754 @end defopt
755
756 @defopt split-height-threshold
757 This variable determines when @code{display-buffer} may split a window,
758 if there are multiple windows. @code{display-buffer} always splits the
759 largest window if it has at least this many lines. If the largest
760 window is not this tall, it is split only if it is the sole window and
761 @code{pop-up-windows} is non-@code{nil}.
762 @end defopt
763
764 @c Emacs 19 feature
765 @defopt pop-up-frames
766 This variable controls whether @code{display-buffer} makes new frames.
767 If it is non-@code{nil}, @code{display-buffer} looks for an existing
768 window already displaying the desired buffer, on any visible frame. If
769 it finds one, it returns that window. Otherwise it makes a new frame.
770 The variables @code{pop-up-windows} and @code{split-height-threshold} do
771 not matter if @code{pop-up-frames} is non-@code{nil}.
772
773 If @code{pop-up-frames} is @code{nil}, then @code{display-buffer} either
774 splits a window or reuses one.
775
776 @xref{Frames}, for more information.
777 @end defopt
778
779 @c Emacs 19 feature
780 @defvar pop-up-frame-function
781 This variable specifies how to make a new frame if @code{pop-up-frames}
782 is non-@code{nil}.
783
784 Its value should be a function of no arguments. When
785 @code{display-buffer} makes a new frame, it does so by calling that
786 function, which should return a frame. The default value of the
787 variable is a function that creates a frame using parameters from
788 @code{pop-up-frame-alist}.
789 @end defvar
790
791 @defvar pop-up-frame-alist
792 This variable holds an alist specifying frame parameters used when
793 @code{display-buffer} makes a new frame. @xref{Frame Parameters}, for
794 more information about frame parameters.
795 @end defvar
796
797 @defvar special-display-buffer-names
798 A list of buffer names for buffers that should be displayed specially.
799 If the buffer's name is in this list, @code{display-buffer} handles the
800 buffer specially.
801
802 By default, special display means to give the buffer a dedicated frame.
803 @end defvar
804
805 @defvar special-display-regexps
806 A list of regular expressions that specify buffers that should be
807 displayed specially. If the buffer's name matches any of the regular
808 expressions in this list, @code{display-buffer} handles the buffer
809 specially.
810
811 By default, special display means to give the buffer a dedicated frame.
812 @end defvar
813
814 @defvar special-display-function
815 This variable holds the function to call to display a buffer specially.
816 It receives the buffer as an argument, and should return the window in
817 which it is displayed.
818
819 The default value of this variable is
820 @code{special-display-popup-frame}.
821 @end defvar
822
823 @defun special-display-popup-frame buffer
824 This function makes @var{buffer} visible in a frame of its own. If
825 @var{buffer} is already displayed in a window in some frame, it makes
826 the frame visible and raises it, to use that window. Otherwise, it
827 creates a frame that will be dedicated to @var{buffer}.
828
829 This function uses an existing window displaying @var{buffer} whether or
830 not it is in a frame of its own; but if you set up the above variables
831 in your init file, before @var{buffer} was created, then presumably the
832 window was previously made by this function.
833 @end defun
834
835 @defopt special-display-frame-alist
836 This variable holds frame parameters for
837 @code{special-display-popup-frame} to use when it creates a frame.
838 @end defopt
839
840 @c Emacs 19 feature
841 @defvar display-buffer-function
842 This variable is the most flexible way to customize the behavior of
843 @code{display-buffer}. If it is non-@code{nil}, it should be a function
844 that @code{display-buffer} calls to do the work. The function should
845 accept two arguments, the same two arguments that @code{display-buffer}
846 received. It should choose or create a window, display the specified
847 buffer, and then return the window.
848
849 This hook takes precedence over all the other options and hooks
850 described above.
851 @end defvar
852
853 @c Emacs 19 feature
854 @cindex dedicated window
855 A window can be marked as ``dedicated'' to its buffer. Then
856 @code{display-buffer} does not try to use that window.
857
858 @defun window-dedicated-p window
859 This function returns @code{t} if @var{window} is marked as dedicated;
860 otherwise @code{nil}.
861 @end defun
862
863 @defun set-window-dedicated-p window flag
864 This function marks @var{window} as dedicated if @var{flag} is
865 non-@code{nil}, and nondedicated otherwise.
866 @end defun
867
868 @node Window Point
869 @section Windows and Point
870 @cindex window position
871 @cindex window point
872 @cindex position in window
873 @cindex point in window
874
875 Each window has its own value of point, independent of the value of
876 point in other windows displaying the same buffer. This makes it useful
877 to have multiple windows showing one buffer.
878
879 @itemize @bullet
880 @item
881 The window point is established when a window is first created; it is
882 initialized from the buffer's point, or from the window point of another
883 window opened on the buffer if such a window exists.
884
885 @item
886 Selecting a window sets the value of point in its buffer to the window's
887 value of point. Conversely, deselecting a window sets the window's
888 value of point from that of the buffer. Thus, when you switch between
889 windows that display a given buffer, the point value for the selected
890 window is in effect in the buffer, while the point values for the other
891 windows are stored in those windows.
892
893 @item
894 As long as the selected window displays the current buffer, the window's
895 point and the buffer's point always move together; they remain equal.
896
897 @item
898 @xref{Positions}, for more details on buffer positions.
899 @end itemize
900
901 As far as the user is concerned, point is where the cursor is, and
902 when the user switches to another buffer, the cursor jumps to the
903 position of point in that buffer.
904
905 @defun window-point window
906 This function returns the current position of point in @var{window}.
907 For a nonselected window, this is the value point would have (in that
908 window's buffer) if that window were selected.
909
910 When @var{window} is the selected window and its buffer is also the
911 current buffer, the value returned is the same as point in that buffer.
912
913 Strictly speaking, it would be more correct to return the
914 ``top-level'' value of point, outside of any @code{save-excursion}
915 forms. But that value is hard to find.
916 @end defun
917
918 @defun set-window-point window position
919 This function positions point in @var{window} at position
920 @var{position} in @var{window}'s buffer.
921 @end defun
922
923 @node Window Start
924 @section The Window Start Position
925
926 Each window contains a marker used to keep track of a buffer position
927 that specifies where in the buffer display should start. This position
928 is called the @dfn{display-start} position of the window (or just the
929 @dfn{start}). The character after this position is the one that appears
930 at the upper left corner of the window. It is usually, but not
931 inevitably, at the beginning of a text line.
932
933 @defun window-start &optional window
934 @cindex window top line
935 This function returns the display-start position of window
936 @var{window}. If @var{window} is @code{nil}, the selected window is
937 used. For example,
938
939 @example
940 @group
941 (window-start)
942 @result{} 7058
943 @end group
944 @end example
945
946 When you create a window, or display a different buffer in it, the
947 display-start position is set to a display-start position recently used
948 for the same buffer, or 1 if the buffer doesn't have any.
949
950 For a realistic example, see the description of @code{count-lines} in
951 @ref{Text Lines}.
952 @end defun
953
954 @defun window-end &optional window
955 This function returns the position of the end of the display in window
956 @var{window}. If @var{window} is @code{nil}, the selected window is
957 used.
958
959 If the last redisplay of @var{window} was preempted, and did not finish,
960 Emacs does not know the position of the end of display in that window.
961 In that case, this function returns a value that is not correct. In a
962 future version, @code{window-end} will return @code{nil} in that case.
963 @ignore
964 in that case, this function returns @code{nil}. You can compute where
965 the end of the window @emph{would} have been, if redisplay had finished,
966 like this:
967
968 @example
969 (save-excursion
970 (goto-char (window-start window))
971 (vertical-motion (1- (window-height window))
972 window)
973 (point))
974 @end example
975 @end ignore
976 @end defun
977
978 @defun set-window-start window position &optional noforce
979 This function sets the display-start position of @var{window} to
980 @var{position} in @var{window}'s buffer. It returns @var{position}.
981
982 The display routines insist that the position of point be visible when a
983 buffer is displayed. Normally, they change the display-start position
984 (that is, scroll the window) whenever necessary to make point visible.
985 However, if you specify the start position with this function using
986 @code{nil} for @var{noforce}, it means you want display to start at
987 @var{position} even if that would put the location of point off the
988 screen. If this does place point off screen, the display routines move
989 point to the left margin on the middle line in the window.
990
991 For example, if point @w{is 1} and you set the start of the window @w{to
992 2}, then point would be ``above'' the top of the window. The display
993 routines will automatically move point if it is still 1 when redisplay
994 occurs. Here is an example:
995
996 @example
997 @group
998 ;; @r{Here is what @samp{foo} looks like before executing}
999 ;; @r{the @code{set-window-start} expression.}
1000 @end group
1001
1002 @group
1003 ---------- Buffer: foo ----------
1004 @point{}This is the contents of buffer foo.
1005 2
1006 3
1007 4
1008 5
1009 6
1010 ---------- Buffer: foo ----------
1011 @end group
1012
1013 @group
1014 (set-window-start
1015 (selected-window)
1016 (1+ (window-start)))
1017 @result{} 2
1018 @end group
1019
1020 @group
1021 ;; @r{Here is what @samp{foo} looks like after executing}
1022 ;; @r{the @code{set-window-start} expression.}
1023 ---------- Buffer: foo ----------
1024 his is the contents of buffer foo.
1025 2
1026 3
1027 @point{}4
1028 5
1029 6
1030 ---------- Buffer: foo ----------
1031 @end group
1032 @end example
1033
1034 If @var{noforce} is non-@code{nil}, and @var{position} would place point
1035 off screen at the next redisplay, then redisplay computes a new window-start
1036 position that works well with point, and thus @var{position} is not used.
1037 @end defun
1038
1039 @defun pos-visible-in-window-p &optional position window
1040 This function returns @code{t} if @var{position} is within the range
1041 of text currently visible on the screen in @var{window}. It returns
1042 @code{nil} if @var{position} is scrolled vertically out of view. The
1043 argument @var{position} defaults to the current position of point;
1044 @var{window}, to the selected window. Here is an example:
1045
1046 @example
1047 @group
1048 (or (pos-visible-in-window-p
1049 (point) (selected-window))
1050 (recenter 0))
1051 @end group
1052 @end example
1053
1054 The @code{pos-visible-in-window-p} function considers only vertical
1055 scrolling. If @var{position} is out of view only because @var{window}
1056 has been scrolled horizontally, @code{pos-visible-in-window-p} returns
1057 @code{t}. @xref{Horizontal Scrolling}.
1058 @end defun
1059
1060 @node Vertical Scrolling
1061 @section Vertical Scrolling
1062 @cindex vertical scrolling
1063 @cindex scrolling vertically
1064
1065 Vertical scrolling means moving the text up or down in a window. It
1066 works by changing the value of the window's display-start location. It
1067 may also change the value of @code{window-point} to keep it on the
1068 screen.
1069
1070 In the commands @code{scroll-up} and @code{scroll-down}, the directions
1071 ``up'' and ``down'' refer to the motion of the text in the buffer at which
1072 you are looking through the window. Imagine that the text is
1073 written on a long roll of paper and that the scrolling commands move the
1074 paper up and down. Thus, if you are looking at text in the middle of a
1075 buffer and repeatedly call @code{scroll-down}, you will eventually see
1076 the beginning of the buffer.
1077
1078 Some people have urged that the opposite convention be used: they
1079 imagine that the window moves over text that remains in place. Then
1080 ``down'' commands would take you to the end of the buffer. This view is
1081 more consistent with the actual relationship between windows and the
1082 text in the buffer, but it is less like what the user sees. The
1083 position of a window on the terminal does not move, and short scrolling
1084 commands clearly move the text up or down on the screen. We have chosen
1085 names that fit the user's point of view.
1086
1087 The scrolling functions (aside from @code{scroll-other-window}) have
1088 unpredictable results if the current buffer is different from the buffer
1089 that is displayed in the selected window. @xref{Current Buffer}.
1090
1091 @deffn Command scroll-up &optional count
1092 This function scrolls the text in the selected window upward
1093 @var{count} lines. If @var{count} is negative, scrolling is actually
1094 downward.
1095
1096 If @var{count} is @code{nil} (or omitted), then the length of scroll
1097 is @code{next-screen-context-lines} lines less than the usable height of
1098 the window (not counting its mode line).
1099
1100 @code{scroll-up} returns @code{nil}.
1101 @end deffn
1102
1103 @deffn Command scroll-down &optional count
1104 This function scrolls the text in the selected window downward
1105 @var{count} lines. If @var{count} is negative, scrolling is actually
1106 upward.
1107
1108 If @var{count} is omitted or @code{nil}, then the length of the scroll
1109 is @code{next-screen-context-lines} lines less than the usable height of
1110 the window (not counting its mode line).
1111
1112 @code{scroll-down} returns @code{nil}.
1113 @end deffn
1114
1115 @deffn Command scroll-other-window &optional count
1116 This function scrolls the text in another window upward @var{count}
1117 lines. Negative values of @var{count}, or @code{nil}, are handled
1118 as in @code{scroll-up}.
1119
1120 The window that is scrolled is normally the one following the selected
1121 window in the cyclic ordering of windows---the window that
1122 @code{next-window} would return. @xref{Cyclic Window Ordering}.
1123
1124 You can specify a buffer to scroll with the variable
1125 @code{other-window-scroll-buffer}. When the selected window is the
1126 minibuffer, the next window is normally the one at the top left corner.
1127 You can specify a different window to scroll with the variable
1128 @code{minibuffer-scroll-window}. This variable has no effect when any
1129 other window is selected. @xref{Minibuffer Misc}.
1130
1131 When the minibuffer is active, it is the next window if the selected
1132 window is the one at the bottom right corner. In this case,
1133 @code{scroll-other-window} attempts to scroll the minibuffer. If the
1134 minibuffer contains just one line, it has nowhere to scroll to, so the
1135 line reappears after the echo area momentarily displays the message
1136 ``Beginning of buffer''.
1137 @end deffn
1138
1139 @c Emacs 19 feature
1140 @defvar other-window-scroll-buffer
1141 If this variable is non-@code{nil}, it tells @code{scroll-other-window}
1142 which buffer to scroll.
1143 @end defvar
1144
1145 @defopt scroll-step
1146 This variable controls how scrolling is done automatically when point
1147 moves off the screen. If the value is zero, then redisplay scrolls the
1148 text to center point vertically in the window. If the value is a
1149 positive integer @var{n}, then redisplay brings point back on screen by
1150 scrolling @var{n} lines in either direction, if possible; otherwise, it
1151 centers point. The default value is zero.
1152 @end defopt
1153
1154 @defopt next-screen-context-lines
1155 The value of this variable is the number of lines of continuity to
1156 retain when scrolling by full screens. For example, @code{scroll-up}
1157 with an argument of @code{nil} scrolls so that this many lines at the
1158 bottom of the window appear instead at the top. The default value is
1159 @code{2}.
1160 @end defopt
1161
1162 @deffn Command recenter &optional count
1163 @cindex centering point
1164 This function scrolls the selected window to put the text where point
1165 is located at a specified vertical position within the window.
1166
1167 If @var{count} is a nonnegative number, it puts the line containing
1168 point @var{count} lines down from the top of the window. If @var{count}
1169 is a negative number, then it counts upward from the bottom of the
1170 window, so that @minus{}1 stands for the last usable line in the window.
1171 If @var{count} is a non-@code{nil} list, then it stands for the line in
1172 the middle of the window.
1173
1174 If @var{count} is @code{nil}, @code{recenter} puts the line containing
1175 point in the middle of the window, then clears and redisplays the entire
1176 selected frame.
1177
1178 When @code{recenter} is called interactively, @var{count} is the raw
1179 prefix argument. Thus, typing @kbd{C-u} as the prefix sets the
1180 @var{count} to a non-@code{nil} list, while typing @kbd{C-u 4} sets
1181 @var{count} to 4, which positions the current line four lines from the
1182 top.
1183
1184 With an argument of zero, @code{recenter} positions the current line at
1185 the top of the window. This action is so handy that some people make a
1186 separate key binding to do this. For example,
1187
1188 @example
1189 @group
1190 (defun line-to-top-of-window ()
1191 "Scroll current line to top of window.
1192 Replaces three keystroke sequence C-u 0 C-l."
1193 (interactive)
1194 (recenter 0))
1195
1196 (global-set-key [kp-multiply] 'line-to-top-of-window)
1197 @end group
1198 @end example
1199 @end deffn
1200
1201 @node Horizontal Scrolling
1202 @section Horizontal Scrolling
1203 @cindex horizontal scrolling
1204
1205 Because we read English first from top to bottom and second from left
1206 to right, horizontal scrolling is not like vertical scrolling. Vertical
1207 scrolling involves selection of a contiguous portion of text to display.
1208 Horizontal scrolling causes part of each line to go off screen. The
1209 amount of horizontal scrolling is therefore specified as a number of
1210 columns rather than as a position in the buffer. It has nothing to do
1211 with the display-start position returned by @code{window-start}.
1212
1213 Usually, no horizontal scrolling is in effect; then the leftmost
1214 column is at the left edge of the window. In this state, scrolling to
1215 the right is meaningless, since there is no data to the left of the
1216 screen to be revealed by it; so this is not allowed. Scrolling to the
1217 left is allowed; it scrolls the first columns of text off the edge of
1218 the window and can reveal additional columns on the right that were
1219 truncated before. Once a window has a nonzero amount of leftward
1220 horizontal scrolling, you can scroll it back to the right, but only so
1221 far as to reduce the net horizontal scroll to zero. There is no limit
1222 to how far left you can scroll, but eventually all the text will
1223 disappear off the left edge.
1224
1225 @deffn Command scroll-left count
1226 This function scrolls the selected window @var{count} columns to the
1227 left (or to the right if @var{count} is negative). The return value is
1228 the total amount of leftward horizontal scrolling in effect after the
1229 change---just like the value returned by @code{window-hscroll} (below).
1230 @end deffn
1231
1232 @deffn Command scroll-right count
1233 This function scrolls the selected window @var{count} columns to the
1234 right (or to the left if @var{count} is negative). The return value is
1235 the total amount of leftward horizontal scrolling in effect after the
1236 change---just like the value returned by @code{window-hscroll} (below).
1237
1238 Once you scroll a window as far right as it can go, back to its normal
1239 position where the total leftward scrolling is zero, attempts to scroll
1240 any farther right have no effect.
1241 @end deffn
1242
1243 @defun window-hscroll &optional window
1244 This function returns the total leftward horizontal scrolling of
1245 @var{window}---the number of columns by which the text in @var{window}
1246 is scrolled left past the left margin.
1247
1248 The value is never negative. It is zero when no horizontal scrolling
1249 has been done in @var{window} (which is usually the case).
1250
1251 If @var{window} is @code{nil}, the selected window is used.
1252
1253 @example
1254 @group
1255 (window-hscroll)
1256 @result{} 0
1257 @end group
1258 @group
1259 (scroll-left 5)
1260 @result{} 5
1261 @end group
1262 @group
1263 (window-hscroll)
1264 @result{} 5
1265 @end group
1266 @end example
1267 @end defun
1268
1269 @defun set-window-hscroll window columns
1270 This function sets the number of columns from the left margin that
1271 @var{window} is scrolled to the value of @var{columns}. The argument
1272 @var{columns} should be zero or positive; if not, it is taken as zero.
1273
1274 The value returned is @var{columns}.
1275
1276 @example
1277 @group
1278 (set-window-hscroll (selected-window) 10)
1279 @result{} 10
1280 @end group
1281 @end example
1282 @end defun
1283
1284 Here is how you can determine whether a given position @var{position}
1285 is off the screen due to horizontal scrolling:
1286
1287 @example
1288 @group
1289 (defun hscroll-on-screen (window position)
1290 (save-excursion
1291 (goto-char position)
1292 (and
1293 (>= (- (current-column) (window-hscroll window)) 0)
1294 (< (- (current-column) (window-hscroll window))
1295 (window-width window)))))
1296 @end group
1297 @end example
1298
1299 @node Size of Window
1300 @section The Size of a Window
1301 @cindex window size
1302 @cindex size of window
1303
1304 An Emacs window is rectangular, and its size information consists of
1305 the height (the number of lines) and the width (the number of character
1306 positions in each line). The mode line is included in the height. But
1307 the width does not count the scroll bar or the column of @samp{|}
1308 characters that separates side-by-side windows.
1309
1310 The following three functions return size information about a window:
1311
1312 @defun window-height &optional window
1313 This function returns the number of lines in @var{window}, including
1314 its mode line. If @var{window} fills its entire frame, this is one less
1315 than the value of @code{frame-height} on that frame (since the last line
1316 is always reserved for the minibuffer).
1317
1318 If @var{window} is @code{nil}, the function uses the selected window.
1319
1320 @example
1321 @group
1322 (window-height)
1323 @result{} 23
1324 @end group
1325 @group
1326 (split-window-vertically)
1327 @result{} #<window 4 on windows.texi>
1328 @end group
1329 @group
1330 (window-height)
1331 @result{} 11
1332 @end group
1333 @end example
1334 @end defun
1335
1336 @defun window-width &optional window
1337 This function returns the number of columns in @var{window}. If
1338 @var{window} fills its entire frame, this is the same as the value of
1339 @code{frame-width} on that frame. The width does not include the
1340 window's scroll bar or the column of @samp{|} characters that separates
1341 side-by-side windows.
1342
1343 If @var{window} is @code{nil}, the function uses the selected window.
1344
1345 @example
1346 @group
1347 (window-width)
1348 @result{} 80
1349 @end group
1350 @end example
1351 @end defun
1352
1353 @defun window-edges &optional window
1354 This function returns a list of the edge coordinates of @var{window}.
1355 If @var{window} is @code{nil}, the selected window is used.
1356
1357 The order of the list is @code{(@var{left} @var{top} @var{right}
1358 @var{bottom})}, all elements relative to 0, 0 at the top left corner of
1359 the frame. The element @var{right} of the value is one more than the
1360 rightmost column used by @var{window}, and @var{bottom} is one more than
1361 the bottommost row used by @var{window} and its mode-line.
1362
1363 When you have side-by-side windows, the right edge value for a window
1364 with a neighbor on the right includes the width of the separator between
1365 the window and that neighbor. This separator may be a column of
1366 @samp{|} characters or it may be a scroll bar. Since the width of the
1367 window does not include this separator, the width does not equal the
1368 difference between the right and left edges in this case.
1369
1370 Here is the result obtained on a typical 24-line terminal with just one
1371 window:
1372
1373 @example
1374 @group
1375 (window-edges (selected-window))
1376 @result{} (0 0 80 23)
1377 @end group
1378 @end example
1379
1380 @noindent
1381 The bottom edge is at line 23 because the last line is the echo area.
1382
1383 If @var{window} is at the upper left corner of its frame, @var{right}
1384 and @var{bottom} are the same as the values returned by
1385 @code{(window-width)} and @code{(window-height)} respectively, and
1386 @var{top} and @var{bottom} are zero. For example, the edges of the
1387 following window are @w{@samp{0 0 5 8}}. Assuming that the frame has
1388 more than 8 columns, the last column of the window (column 7) holds a
1389 border rather than text. The last row (row 4) holds the mode line,
1390 shown here with @samp{xxxxxxxxx}.
1391
1392 @example
1393 @group
1394 0
1395 _______
1396 0 | |
1397 | |
1398 | |
1399 | |
1400 xxxxxxxxx 4
1401
1402 7
1403 @end group
1404 @end example
1405
1406 When there are side-by-side windows, any window not at the right edge of
1407 its frame has a separator in its last column or columns. The separator
1408 counts as one or two columns in the width of the window. A window never
1409 includes a separator on its left, since that belongs to the window to
1410 the left.
1411
1412 In the following example, let's suppose that the frame is 7
1413 columns wide. Then the edges of the left window are @w{@samp{0 0 4 3}}
1414 and the edges of the right window are @w{@samp{4 0 7 3}}.
1415
1416 @example
1417 @group
1418 ___ ___
1419 | | |
1420 | | |
1421 xxxxxxxxx
1422
1423 0 34 7
1424 @end group
1425 @end example
1426 @end defun
1427
1428 @node Resizing Windows
1429 @section Changing the Size of a Window
1430 @cindex window resizing
1431 @cindex changing window size
1432 @cindex window size, changing
1433
1434 The window size functions fall into two classes: high-level commands
1435 that change the size of windows and low-level functions that access
1436 window size. Emacs does not permit overlapping windows or gaps between
1437 windows, so resizing one window affects other windows.
1438
1439 @deffn Command enlarge-window size &optional horizontal
1440 This function makes the selected window @var{size} lines taller,
1441 stealing lines from neighboring windows. It takes the lines from one
1442 window at a time until that window is used up, then takes from another.
1443 If a window from which lines are stolen shrinks below
1444 @code{window-min-height} lines, that window disappears.
1445
1446 If @var{horizontal} is non-@code{nil}, this function makes
1447 @var{window} wider by @var{size} columns, stealing columns instead of
1448 lines. If a window from which columns are stolen shrinks below
1449 @code{window-min-width} columns, that window disappears.
1450
1451 If the requested size would exceed that of the window's frame, then the
1452 function makes the window occupy the entire height (or width) of the
1453 frame.
1454
1455 If @var{size} is negative, this function shrinks the window by
1456 @minus{}@var{size} lines or columns. If that makes the window smaller
1457 than the minimum size (@code{window-min-height} and
1458 @code{window-min-width}), @code{enlarge-window} deletes the window.
1459
1460 @code{enlarge-window} returns @code{nil}.
1461 @end deffn
1462
1463 @deffn Command enlarge-window-horizontally columns
1464 This function makes the selected window @var{columns} wider.
1465 It could be defined as follows:
1466
1467 @example
1468 @group
1469 (defun enlarge-window-horizontally (columns)
1470 (enlarge-window columns t))
1471 @end group
1472 @end example
1473 @end deffn
1474
1475 @deffn Command shrink-window size &optional horizontal
1476 This function is like @code{enlarge-window} but negates the argument
1477 @var{size}, making the selected window smaller by giving lines (or
1478 columns) to the other windows. If the window shrinks below
1479 @code{window-min-height} or @code{window-min-width}, then it disappears.
1480
1481 If @var{size} is negative, the window is enlarged by @minus{}@var{size}
1482 lines or columns.
1483 @end deffn
1484
1485 @deffn Command shrink-window-horizontally columns
1486 This function makes the selected window @var{columns} narrower.
1487 It could be defined as follows:
1488
1489 @example
1490 @group
1491 (defun shrink-window-horizontally (columns)
1492 (shrink-window columns t))
1493 @end group
1494 @end example
1495 @end deffn
1496
1497 @cindex minimum window size
1498 The following two variables constrain the window-size-changing
1499 functions to a minimum height and width.
1500
1501 @defopt window-min-height
1502 The value of this variable determines how short a window may become
1503 before it is automatically deleted. Making a window smaller than
1504 @code{window-min-height} automatically deletes it, and no window may be
1505 created shorter than this. The absolute minimum height is two (allowing
1506 one line for the mode line, and one line for the buffer display).
1507 Actions that change window sizes reset this variable to two if it is
1508 less than two. The default value is 4.
1509 @end defopt
1510
1511 @defopt window-min-width
1512 The value of this variable determines how narrow a window may become
1513 before it automatically deleted. Making a window smaller than
1514 @code{window-min-width} automatically deletes it, and no window may be
1515 created narrower than this. The absolute minimum width is one; any
1516 value below that is ignored. The default value is 10.
1517 @end defopt
1518
1519 @node Coordinates and Windows
1520 @section Coordinates and Windows
1521
1522 This section describes how to relate screen coordinates to windows.
1523
1524 @defun window-at x y &optional frame
1525 This function returns the window containing the specified cursor
1526 position in the frame @var{frame}. The coordinates @var{x} and @var{y}
1527 are measured in characters and count from the top left corner of the
1528 frame. If they are out of range, @code{window-at} returns @code{nil}.
1529
1530 If you omit @var{frame}, the selected frame is used.
1531 @end defun
1532
1533 @defun coordinates-in-window-p coordinates window
1534 This function checks whether a particular frame position falls within
1535 the window @var{window}.
1536
1537 The argument @var{coordinates} is a cons cell of this form:
1538
1539 @example
1540 (@var{x} . @var{y})
1541 @end example
1542
1543 @noindent
1544 The coordinates @var{x} and @var{y} are measured in characters, and
1545 count from the top left corner of the screen or frame.
1546
1547 The value of @code{coordinates-in-window-p} is non-@code{nil} if the
1548 coordinates are inside @var{window}. The value also indicates what part
1549 of the window the position is in, as follows:
1550
1551 @table @code
1552 @item (@var{relx} . @var{rely})
1553 The coordinates are inside @var{window}. The numbers @var{relx} and
1554 @var{rely} are the equivalent window-relative coordinates for the
1555 specified position, counting from 0 at the top left corner of the
1556 window.
1557
1558 @item mode-line
1559 The coordinates are in the mode line of @var{window}.
1560
1561 @item vertical-split
1562 The coordinates are in the vertical line between @var{window} and its
1563 neighbor to the right. This value occurs only if the window doesn't
1564 have a scroll bar; positions in a scroll bar are considered outside the
1565 window.
1566
1567 @item nil
1568 The coordinates are not in any part of @var{window}.
1569 @end table
1570
1571 The function @code{coordinates-in-window-p} does not require a frame as
1572 argument because it always uses the frame that @var{window} is on.
1573 @end defun
1574
1575 @node Window Configurations
1576 @section Window Configurations
1577 @cindex window configurations
1578 @cindex saving window information
1579
1580 A @dfn{window configuration} records the entire layout of a
1581 frame---all windows, their sizes, which buffers they contain, what part
1582 of each buffer is displayed, and the values of point and the mark. You
1583 can bring back an entire previous layout by restoring a window
1584 configuration previously saved.
1585
1586 If you want to record all frames instead of just one, use a frame
1587 configuration instead of a window configuration. @xref{Frame
1588 Configurations}.
1589
1590 @defun current-window-configuration
1591 This function returns a new object representing Emacs's current window
1592 configuration, namely the number of windows, their sizes and current
1593 buffers, which window is the selected window, and for each window the
1594 displayed buffer, the display-start position, and the positions of point
1595 and the mark. An exception is made for point in the current buffer,
1596 whose value is not saved.
1597 @end defun
1598
1599 @defun set-window-configuration configuration
1600 This function restores the configuration of Emacs's windows and
1601 buffers to the state specified by @var{configuration}. The argument
1602 @var{configuration} must be a value that was previously returned by
1603 @code{current-window-configuration}.
1604
1605 Here is a way of using this function to get the same effect
1606 as @code{save-window-excursion}:
1607
1608 @example
1609 @group
1610 (let ((config (current-window-configuration)))
1611 (unwind-protect
1612 (progn (split-window-vertically nil)
1613 @dots{})
1614 (set-window-configuration config)))
1615 @end group
1616 @end example
1617 @end defun
1618
1619 @defspec save-window-excursion forms@dots{}
1620 This special form records the window configuration, executes @var{forms}
1621 in sequence, then restores the earlier window configuration. The window
1622 configuration includes the value of point and the portion of the buffer
1623 that is visible. It also includes the choice of selected window.
1624 However, it does not include the value of point in the current buffer;
1625 use @code{save-excursion} if you wish to preserve that.
1626
1627 The return value is the value of the final form in @var{forms}.
1628 For example:
1629
1630 @example
1631 @group
1632 (split-window)
1633 @result{} #<window 25 on control.texi>
1634 @end group
1635 @group
1636 (setq w (selected-window))
1637 @result{} #<window 19 on control.texi>
1638 @end group
1639 @group
1640 (save-window-excursion
1641 (delete-other-windows w)
1642 (switch-to-buffer "foo")
1643 'do-something)
1644 @result{} do-something
1645 ;; @r{The screen is now split again.}
1646 @end group
1647 @end example
1648 @end defspec
1649
1650 @defun window-configuration-p object
1651 This function returns @code{t} if @var{object} is a window configuration.
1652 @end defun
1653
1654 Primitives to look inside of window configurations would make sense,
1655 but none are implemented. It is not clear they are useful enough to be
1656 worth implementing.