comparison man/lispref/windows.texi @ 0:376386a54a3c r19-14

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