DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T l

⟦dc6f9d9c6⟧ TextFile

    Length: 52827 (0xce5b)
    Types: TextFile
    Names: »lispref-13«

Derivation

└─⟦a05ed705a⟧ Bits:30007078 DKUUG GNU 2/12/89
    └─⟦c06c473ab⟧ »./UNRELEASED/lispref.tar.Z« 
        └─⟦1b57a2ffe⟧ 
            └─⟦this⟧ »lispref-13« 

TextFile

Info file: lispref,    -*-Text-*-
produced by texinfo-format-buffer
from file: lispref.texinfo









This file documents GNU Emacs Lisp.

This is Edition 0.1 Beta of the GNU Emacs Lisp Reference Manual, for
Emacs Version 18, with some references to Emacs Version 19.

Please read this document for review purposes.

Published by the Free Software Foundation, 675 Massachusetts Avenue,
Cambridge, MA 02139 USA

Copyright (C) 1989 Free Software Foundation, Inc.

Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are
preserved on all copies.

Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided that the
entire resulting derived work is distributed under the terms of a
permission notice identical to this one.

Permission is granted to copy and distribute translations of this manual
into another language, under the above conditions for modified versions,
except that this permission notice may be stated in a translation
approved by the Foundation.



▶1f◀
File: lispref  Node: Creating Buffers, Prev: The Buffer List, Up: Buffers, Next: Killing Buffers

Creating Buffers
================

  The following two functions create buffers: `get-buffer-create' may
create a buffer if it finds no existing buffer; `generate-new-buffer'
always creates a new buffer, and gives it a unique name.

  Two other functions that create buffers are
`with-output-to-temp-buffer' (*Note Temporary Displays::) and
`create-file-buffer' (*Note Visiting Files::).

* Function: get-buffer-create NAME

       This function returns a buffer named NAME.  If such a buffer
     already exists, it is returned.  If such a buffer does not exist,
     one is created and returned.  The buffer does not become the
     current buffer---this function does not change which buffer is
     current.

       It is an error if NAME is not a string.

          (get-buffer-create "foo")
               => #<buffer foo>

* Function: generate-new-buffer NAME

       This function returns a newly created, empty buffer.  If there is
     no buffer named NAME, then that is the name of the new buffer.  If
     there is a buffer with that name, then suffixes of the form `<N>'
     are tried, where N is an integer starting with 2, until a new name
     is created.

       It is an error if NAME is not a string.

          (generate-new-buffer "bar")
               => #<buffer bar>
          (generate-new-buffer "bar")
               => #<buffer bar<2>>
          (generate-new-buffer "bar")
               => #<buffer bar<3>>

▶1f◀
File: lispref  Node: Killing Buffers, Prev: Creating Buffers, Up: Buffers, Next: Changing Buffers

Killing Buffers
===============

  There are two functions for killing buffers.  One is for killing a
specified buffer; it is used in both in code and interactively.  The
other is used interactivley and is for going through the list of
displayed buffers and killing particular ones.

  The `buffer-name' of a killed buffer is `nil'.  You can use this
feature when testing whether a buffer has been killed.

     (defun killed-buffer-p (buffer-or-name)
       "Return t if buffer is killed."
       (not (buffer-name buffer-or-name)))

* Command: kill-buffer BUFFER-OR-NAME

       This function kills the buffer BUFFER-OR-NAME, freeing all of its
     memory for use as space for other buffers.  (In version 18, the
     memory is not returned to the operating system.)  The function
     returns `nil'.

       A buffer which has been killed is marked specially so that you
     cannot make it current or display it.  Its name is forgotten, and
     `buffer-name' will return `nil' for it.  Killed buffers retain
     their identity, however; two distinct buffers, when killed, remain
     distinct according to `eq'.

       If the buffer is visiting a file when `kill-buffer' is called and
     the buffer has not been saved since it was last modified, the user
     is asked if he or she *really* wants to kill the buffer.  This is
     done even if `kill-buffer' is not called interactively.  To prevent
     this request for confirmation, clear the modified flag before
     calling `kill-buffer'.

          (kill-buffer "foo.unchanged")
               => nil
          (kill-buffer "foo.changed")

          ---------- Buffer: Minibuffer ----------
          Buffer foo.changed modified; kill anyway? (yes or no) yes
          ---------- Buffer: Minibuffer ----------

               => nil


▶1f◀
File: lispref  Node: Changing Buffers, Prev: Killing Buffers, Up: Buffers

Changing Buffers
================

  There are two major ways to change buffers: one way is to make it
"current", the other way is to "switch" to the buffer.

  The current buffer is the one in which editing takes place; but it is
not necessarily displayed on the screen.  You may not be able to see the
current buffer.  Programs work on the current buffer---a computer
program does not have eyes and does not look at the buffer on the
screen.

  Switching to a buffer, on the other hand, not only makes the buffer
the current buffer, which is the one in which editing takes place; it
also displays the buffer in the selected window so you can see it.
Humans must switch to a buffer they wish to work on since they have to
see what they are doing.

  Thus, directing Emacs's attention to a buffer does just one thing:
make it the current buffer; switching to a buffer does two things: make
it the current buffer, and display it on the screen.

  `switch-to-buffer' is a switch command; it changes the current buffer
(the one in which editing takes place) and displays it in the selected
window (the one with the cursor in it).

  `set-buffer' changes the current buffer, but leaves the buffer that
was displayed in the selected window still displayed.

  Note that when it comes time to get more keyboard input, or when
keyboard input is provided, the buffer displayed in the selected window
becomes the current buffer, regardless of previous calls to
`set-buffer'.  This prevents confusion: the buffer you see, when Emacs
reads a command, is the one to which your next command will apply.
*Note Command Loop::.

  However, Lisp programs should not rely on this.  Always use
`set-buffer' within a `save-excursion' that will restore the current
buffer when your program is done.  (*Note Excursions::.)  Otherwise, if
your program is used as a subroutine, the caller will get a surprise!
Here is an example: the code for the command `append-to-buffer' (with
the documentation string abridged):

     (defun append-to-buffer (buffer start end)
       "Append to specified buffer the text of the region.
       (interactive "BAppend to buffer: \nr")
       (let ((oldbuf (current-buffer)))
         (save-excursion
           (set-buffer (get-buffer-create buffer))
           (insert-buffer-substring oldbuf start end))))

In this function, a local variable is bound to the current buffer, and
then `save-excursion' function records the values of point, mark, and
the original buffer.  Next, the `set-buffer' function makes a new buffer
current.  `insert-buffer-substring' then copies the string from the
original buffer to the current buffer.  Because the current buffer is
not displayed in the selected window, you normally cannot see the
insertion.  To see it, you have to switch to the other buffer.

* Function: set-buffer BUFFER-OR-NAME

       This function makes BUFFER-OR-NAME the current buffer in which
     editing takes place.  However, it does not display the buffer in
     the currently selected window or in any other window.  This means
     that the user cannot necessarily see the buffer, but Lisp programs
     can work on it.

        This function returns the buffer identified by BUFFER-OR-NAME.
     It is an error if BUFFER-OR-NAME does not identify an existing
     buffer.

       The `set-buffer' function is usually written within a
     `save-excursion', so that the original buffer will be restored when
     the program is done.

* Command: switch-to-buffer BUFFER-OR-NAME &optional NORECORD

       This command makes BUFFER-OR-NAME the current buffer (the buffer
     in which editing takes place).  The command also displays the
     buffer in the selected window, which is the window with the cursor
     in it.  This means that a human can see the buffer and commands
     will apply to it.  The return value is `nil'.

       If BUFFER-OR-NAME does not identify an existing buffer, then a
     new buffer by that name is created.

       If NORECORD is non-`nil', then this buffer is not put on the
     front of the list of recently chosen buffers.  This affects the
     value of `other-buffer'.  (*Note The Buffer List::.)

       The `switch-to-buffer' function is often used interactively, as
     the binding of `C-x b'.  It is also used frequently in programs.

     (Contrast `switch-to-buffer' with `set-buffer', which makes
     BUFFER-OR-NAME the current buffer, but does not display it in the
     selected window.)

* Command: switch-to-buffer-other-window BUFFER-OR-NAME

       This function makes BUFFER-OR-NAME be the current buffer in
     another window, where editing may be done.  The other window
     becomes the selected window, with the cursor there.  If there is
     only one window, then it is split---even if that window is already
     displaying BUFFER-OR-NAME.

* Function: pop-to-buffer BUFFER-OR-NAME &optional OTHER-WINDOW

       This function makes BUFFER-OR-NAME be the current buffer (where
     editing is done) in some window that is preferably different from
     the selected window.  The ``popped-to'' window becomes the selected
     window, with the cursor in it.  If the variable `pop-up-windows' is
     non-`nil', windows may be split to create a new window that is
     different from the original window.  (*Note Splitting Windows::,
     for a description of `pop-up-windows'.

       If OTHER-WINDOW is non-`nil', `pop-to-buffer' finds or creates
     another window even if BUFFER-OR-NAME is already visible in the
     selected window.  Thus BUFFER-OR-NAME could be displayed in two
     windows.  On the other hand, if BUFFER-OR-NAME is the current
     buffer and OTHER-WINDOW is `nil', Emacs will stay with the same
     buffer in the same window.

       If BUFFER-OR-NAME is a string that does not name an existing
     buffer, a buffer by that name is created.

* Function: display-buffer BUFFER-OR-NAME &optional NOT-THIS-WINDOW

       This function makes BUFFER-OR-NAME appear in some window, like
     `pop-to-buffer', but it does not select that window and does not
     make the buffer current.  The selected window is unaltered by this
     function.

       If NOT-THIS-WINDOW is non-`nil' and BUFFER-OR-NAME is shown
     already in the selected window, then the buffer is displayed in a
     second window as well.  Otherwise, if BUFFER-OR-NAME is already
     shown in any window, that is good enough, so this function does
     nothing.

       If the variable `pop-up-windows' is non-`nil', windows can be
     split to display the buffer.  If there are multiple windows,
     `display-buffer' will split the largest window if it has more than
     the number of lines specified by the variable
     `split-height-threshold'.  (*Note Splitting Windows::, for a
     description of the two variables.)

       `display-buffer' returns the window displaying BUFFER-OR-NAME.

* User Option: pop-up-windows

       This global variable determines if `display-buffer' may make new
     windows.  If it is `t' and there is only one window on the screen,
     then that window is split.  If it is `nil', then `display-buffer'
     does not split the single window, but rather replaces its buffer.

* User Option: split-height-threshold

       This global variable determines when `display-buffer' may split a
     window, assuming that there are multiple windows.  `display-buffer'
     splits the largest window if it has at least this many lines.

       If there is only one window, it splits regardless of this value,
     provided `pop-up-windows' is non-`nil'.


▶1f◀
File: lispref  Node: Windows, Prev: Buffers, Up: Top, Next: Positions

Windows
*******

  This chapter describes most of the functions and variables related to
Emacs windows.  However, *Note Emacs Display::, and *Note Changing
Buffers::, for more information.

* Menu:

* Window Basics::       
* Splitting Windows::   
* Deleting Windows::    
* Selecting Windows::   
* Cyclic Window Ordering::      
* Buffers and Windows:: 
* Window Point::        
* Vertical Scrolling::  
* Horizontal Scrolling::        
* Window Size:: 
* Window Configurations::       

▶1f◀
File: lispref  Node: Window Basics, Prev: Windows, Up: Windows, Next: Splitting Windows

Window Basics
=============

  A "window" is the physical area of a terminal in which a buffer is
displayed.  But the term is also used to refer to a Lisp object.  Which
is meant should be clear from the context.

  At all times, there is at least one window displayed on the screen,
and there is exactly one window that we call the "selected window".  The
cursor is in the selected window.  The selected window's buffer is
usually the current buffer, except temporarily during a command when
`set-buffer' has been used.  (*Note Changing Buffers::.)

  For all intents and purposes, a window only exists as long as it is
displayed on the terminal.  Once removed from the display, the window is
effectively deleted and should not be used, *even though there may still
be references to it* from other Lisp objects.  (*Note Deleting
Windows::.)

  Each window has the following attributes:


   * window height

   * window width

   * window edges with respect to the screen

   * the buffer displayed

   * position within the buffer at the upper left of the window

   * how many horizontally scrolled columns

   * point

   * mark

   * position in the window circular list


  Applications use multiple windows for a variety of reasons, but most
often to give different views of the same object.  In Rmail, for
example, if you request a message header summary, you are given a second
window with the headers displayed within it.  In this window, you can
process a message by moving point to the line listing the message and
applying Rmail Summary Mode commands.

  For information about other techniques, *Note Major Modes:
(emacs)Major Modes..  Also, *Note Key Bindings: (emacs)Key Bindings..

  Use of the word `window' to refer to a view of a buffer was
established long ago in Emacs.  The metaphor was inspired by how you
look out a house window---at part (or sometimes all) of an overall view.
You see part (or sometimes all) of a buffer through an Emacs window.  In
Emacs, each window may look upon a different view, like different
windows of a house.

  The term ``window'' as used in this manual means something different
from the term as used in a window system like X.  In this manual, the
term ``window'' refers to one of several in the Emacs "screen".  In a
system like X, the screen may happen to be one window in a window
system.  Expressed another way, Emacs's windows are in a screen that may
itself be a `window' of a windowing system.

  For those familiar with windowing systems, Emacs's windows are
rectangles tiled onto the rectangle of the screen, and every portion of
the screen is part of some window.  There are no areas which do not
belong to a window, except for the minibuffer (and even it acts like a
window sometimes).  This limitation helps avoid wasting the historically
scarce resource of screen space.  It also works very well with
character-only terminals.  Because of the way in which Emacs creates new
windows and resizes them, you can't create every conceivable tiling on
an Emacs screen.  *Note Splitting Windows::.  Also, *Note Window Size::.

  *Note Emacs Display::, for functions related to the Emacs screen.

* Function: windowp OBJECT

       This function returns `t' if object is a window.

▶1f◀
File: lispref  Node: Splitting Windows, Prev: Window Basics, Up: Windows, Next: Deleting Windows

Splitting Windows
=================

  The functions described here split windows, as do two other functions,
`pop-to-buffer' and `display-buffer'.  (*Note Changing Buffers::.)

  The distinction between these functions and the `pop-to-buffer' and
`display-buffer' functions is that the latter refer specifically to
buffers, while the functions described in this section do not.  These
functions let the two ``halves'' of the split window display the
previously visible buffer in the window that was split.

  The `split-window-horizontally' and the `split-window-vertically'
functions described in this section are interfaces to the
`split-windows' function.

* Function: one-window-p &optional NO-MINI

       Returns non-`nil' if there is only one window.  Optional NO-MINI
     non-`nil' means don't count the minibuffer even if it is active.

* Command: split-window &optional WINDOW SIZE HORIZONTAL

       This function splits WINDOW into two, leaving SIZE lines in
     WINDOW (which becomes the top window), and putting the rest of the
     lines that WINDOW had into the new window.

       `split-window' returns the window created.  The original window
     remains the selected window.

       If HORIZONTAL is non-`nil', then WINDOW splits side by side,
     leaving SIZE columns in WINDOW (which becomes the left-hand
     window), and putting the rest of the columns that WINDOW had into
     the new window.

       If WINDOW is omitted, then the selected window is split.

       If SIZE is omitted, then WINDOW is divided evenly into two parts.
     (If there is an odd line, it is allocated to the new window.)

       When `split-window' is called interactively, WINDOW defaults to
     the selected window, and SIZE and HORIZONTAL default to `nil'.

       The following example starts with one window on a screen that is
     50 lines high by 80 columns wide; then the window is split.  (Also,
     *Note Window Point::.)

          (setq w (selected-window))
               => #<window 8 on windows.texinfo>
          (window-edges)               ; Edges in order: left--top--right--bottom
               => (0 0 80 49)

          (setq w2 (split-window w 15))   ; Returns window created
               => #<window 28 on windows.texinfo>
          (window-edges w2)
               => (0 15 80 49)  ; Bottom window; top is line 15
          (window-edges w)
               => (0 0 80 15)   ; Top window

     The screen looks like this:


                   __________   line 0
                  |          |  
                  |    w     |
                  |__________|  line 15
                  |          |
                  |    w2    |
                  |__________|  line 49

           column 1   column 80

     Next, the top window is split horizontally:

          (setq w3 (split-window w 35 t))
               => #<window 32 on windows.texinfo>
          (window-edges w3)
               => (35 0 80 15)  ; Left edge at column 35
          (window-edges w)
               => (0 0 35 15)   ; Right edge at column 35
          (window-edges w2)
               => (0 15 80 49)  ; Bottom window unchanged

     Now, the screen looks like this:

               column 35
                   __________   line 0
                  |   |      |  
                  | w |  w3  |
                  |___|______|  line 15
                  |          |
                  |    w2    |
                  |__________|  line 49

           column 1   column 80

* Command: split-window-vertically SIZE

       This function splits the selected window into two, one above the
     other, leaving the selected window with SIZE lines.

       This function is simply an interface to `split-windows'.  Here is
     the complete function definition for it:

          (defun split-window-vertically (&optional arg)
            "Split selected window into two windows, one above the other.
          This window becomes the uppermost of the two, and gets
          ARG lines.  No arg means split equally."
            (interactive "P")
            (split-window nil (and arg (prefix-numeric-value arg))))

* Command: split-window-horizontally SIZE

       This function splits the selected window into two, side-by-side,
     leaving the selected window with SIZE lines.

       This function is simply an interface to split-windows.  Here is
     the complete definition for `split-window-horizontally', except
     that part of the documentation has been deleted to save space:

          (defun split-window-horizontally (&optional arg)
            "Split selected window into two windows side by side."
            (interactive "P")
            (split-window nil (and arg (prefix-numeric-value arg)) t))


▶1f◀
File: lispref  Node: Deleting Windows, Prev: Splitting Windows, Up: Windows, Next: Selecting Windows

Deleting Windows
================

  A deleted window no longer appears on the screen.  In Emacs version
18, the space it took up is divided proportionally among all siblings;
in version 19, the space is given to one adjacent sibling.

* Command: delete-window &optional WINDOW

       This function removes WINDOW from the display.  If WINDOW is
     omitted, then the selected window is deleted.  It is an error if
     there is only one window being displayed when `delete-window'
     executes.

          Warning: Erroneous information or fatal errors may result by
          using a deleted window.  You can test whether a window has
          been deleted with `(window-point WINDOW)'.

       This function returns `nil'.

       When `delete-window' is called interactively, WINDOW defaults to
     the selected window.


* Command: delete-other-windows WINDOW

       This function makes WINDOW the only window on the screen by
     deleting all the other windows.  If WINDOW is omitted, then the
     selected window is the one remaining.

       The result is `nil'.

* Command: delete-windows-on BUFFER

       This function deletes all windows showing BUFFER.  If there are
     no windows showing BUFFER, then this function does nothing.  If all
     windows are showing BUFFER (including the case where there is only
     one window), then the screen reverts to having a single window
     showing the buffer chosen by `other-buffer'.

       If there are several windows showing different buffers, then
     those showing BUFFER are removed, and the others are expanded to
     fill the void.

       The result is `nil'.

▶1f◀
File: lispref  Node: Selecting Windows, Prev: Deleting Windows, Up: Windows, Next: Cyclic Window Ordering

Selecting Windows
=================

When a window is selected, the buffer in the window becomes the current
buffer.  The cursor will appear in it.

* Function: selected-window

       This function returns the selected window.  This is the window in
     which the cursor appears (and to which many commands apply).

* Function: select-window WINDOW

       This function makes WINDOW the selected window.  The cursor then
     appears in WINDOW (on redisplay).  The current buffer changes to
     WINDOW's buffer

       It returns WINDOW.

          (setq w (next-window))
          (select-window w)
               => #<window 65 on windows.texinfo>

  Often you want to try to select the ``best'' window.  These functions
give you a choice of criteria with which to choose.

* Function: get-lru-window

       This function returns the window least recently used or selected
     for display.  The selected window is the most recently used window.

       The selected window can be the least recently used window if it
     is the only window.  A newly created window becomes the least
     recently used window until it is selected.  The minibuffer window
     is never returned by this function.

          (get-lru-window)
               => #<window 58 on windows.texinfo>

* Function: get-largest-window

       This function returns the window with the largest area (height
     times width).  If the screen is not divided horizontally, then this
     is just the window with the most lines.

       If there are two windows of the same size, then the function
     returns the window which is first in the canonical ordering of
     windows, starting from the seleted window.  The minibuffer is never
     considered for ``largest''.

▶1f◀
File: lispref  Node: Cyclic Window Ordering, Prev: Selecting Windows, Up: Windows, Next: Buffers and Windows

Cycling Through All Windows
===========================

  The order in which windows are selected by functions such as
`next-window' depends on the order in which the screen or the windows
within the screen were split.

  If the screen (or window) was first split vertically (into windows one
above each other), and then the topmost window was split horizontally,
then the ordering is left to right in the top, and then left to right in
the next lower part of the screen, and so on.  If the screen (or window)
was first split horizontally, the ordering is top to bottom in the left
part, and so on.  Within each set of siblings, the order is left to
right, or top to bottom.

* Function: next-window WINDOW &optional MINIBUF

       This function returns the next window after WINDOW in the
     canonical ordering of windows.  The successor to that window is the
     window which would be selected by `(other-window 1)'.

       The ordering includes all the windows except perhaps the
     minibuffer.  The value of the argument MINIBUF determines whether
     the minibuffer is in the window order.

       If MINIBUF is `t', then the canonical ordering includes the
     minibuffer window even if it is not active.  If MINIBUF is neither
     `t' nor `nil', then the minibuffer window is not included even if
     it is active.  *Note Minibuffers::, for what it means for the
     minibuffer to be active.

       In the example, there are two windows in existence.  They both
     happen to be displaying the same buffer.

          (selected-window)
               => #<window 56 on windows.texinfo>
          (next-window (selected-window))
               => #<window 52 on windows.texinfo>
          (next-window (next-window (selected-window)))
               => #<window 56 on windows.texinfo>

       If WINDOW is the only window visible, then this function returns
     WINDOW.

* Function: previous-window WINDOW

       This function returns the window preceding WINDOW in the
     canonical ordering of windows.

* Command: other-window COUNT

       This function selects the COUNT'TH next window.  If count is
     negative, then it selects the COUNT'TH previous window.

       It returns `nil'.

       When called interactively, it sets COUNT to the processed prefix
     argument.

       The canonical ordering of windows specifies the value of the
     COUNT'TH next window.

▶1f◀
File: lispref  Node: Buffers and Windows, Prev: Cyclic Window Ordering, Up: Windows, Next: Window Point

Buffers and Windows
===================

  This section describes low level functions to examine windows or to
show buffers in windows in a precisely controlled fashion.

  *Note Changing Buffers::, for related functions that find a window to
use and specify a buffer for it.  The functions described there are
easier to use than those described here.  Use those described here when
you need complete control.

* Function: set-window-buffer WINDOW BUFFER-OR-NAME

       This function makes WINDOW display BUFFER-OR-NAME as its
     contents.  It returns BUFFER-OR-NAME.

          (set-window-buffer (selected-window) "foo")
               => nil

* Function: window-buffer &optional WINDOW

       This function returns the buffer that WINDOW is displaying.  If
     WINDOW is omitted, then this function returns the buffer for the
     selected window.

          (window-buffer)
               => #<buffer windows.texinfo>

* Function: get-buffer-window BUFFER-OR-NAME

       This function returns a window currently displaying
     BUFFER-OR-NAME, or `nil' if there is none.  If there are several
     such windows, then the function returns the window which is first
     in the canonical ordering of windows, starting from the selected
     window.

* Command: replace-buffer-in-windows BUFFER

       This function replaces BUFFER with some other buffer in all
     windows showing it.  The other buffer used is chosen with
     `other-buffer'; but in the usual applications of this function, you
     don't care which other buffer is used.

       This function returns `nil'.

▶1f◀
File: lispref  Node: Window Point, Prev: Buffers and Windows, Up: Windows, Next: Vertical Scrolling

Window Point
============

  Each window has a value of point, which is independent of the value of
point in other windows on the same buffer.

   * The window point is established when a window is first opened on a
     buffer and the initial value of the window point is set to be the
     value of the buffer's point or the window point of another window
     opened on the buffer, if such a window exists.

   * While the selected window displays the current buffer, the changing
     the value of point in the window changes the value of point in the
     buffer.

   * When the last window opened on a buffer is deleted, the value of
     point in the buffer is left set to the value of the window's point
     before the window was deleted.  *Note Positions::, for more details
     on positions.

  As far as the user is concerned, point is where the cursor is, and
when the user switches to another buffer, the cursor jumps to the
position of point in that buffer.

* Function: window-point WINDOW

       This function returns the current position of the point in
     WINDOW.  For a nonselected window, this is the value the point
     would have if that window were selected.

       When WINDOW is the selected window and its buffer is also
     currently selected, the value returned is the same as `(point)'.

       It would be more strictly correct to return the `top-level' value
     of point, outside of any `save-excursion' forms.  But that is hard
     to find.

* Function: set-window-point WINDOW POSITION

       This function positions the point in WINDOW at POSITION in
     WINDOW's buffer.

* Function: window-start &optional WINDOW

       This function returns the position in the buffer displayed by
     WINDOW at which the display starts.  This is the same number that
     `(point)' returns when the cursor is positioned at the beginning of
     the top line in the window.

       If WINDOW is `nil', the selected window is used.

          (window-start)
               => 7058

* Function: set-window-start WINDOW POSITION &optional NOFORCE

       This function makes the display in WINDOW start at POSITION in
     WINDOW's buffer.  Normally the display starts at the beginning of a
     line, although this is not required.

       Point is associated with a position within the buffer, and must
     be visible.  In the case that this function completes in such a way
     that point would not be visible on the screen, Emacs moves point so
     that point is visible.  For example, if point is 1 and we attempt
     to set the start of the window at 2, then the position of point
     would be ``above'' the window, except that Emacs re-positions point
     so that it is visible.  (Point is placed in the left-most column of
     the middle line of the window.)

          ;; Here is what `foo' looks like before executing
          ;; the `set-window-start' expression.

          ---------- Buffer: foo ----------
          -!-This is the contents of buffer foo.
          2
          3
          4
          5
          6
          ---------- Buffer: foo ----------

          (set-window-start (selected-window) (1+ (window-start)))

          ;; Here is what `foo' looks like after executing
          ;; the `set-window-start' expression.

          ---------- Buffer: foo ----------
          his is the contents of buffer foo.
          2
          3
          -!-4
          5
          6
          ---------- Buffer: foo ----------

               => 2

       However, when NOFORCE is non-`nil', the function does not change
     the start position or the value of point if in changing the start
     position it would move point off the screen and then re-position
     it.  In this case, the function has no effect.

       The function returns the requested starting position of the
     window, regardless of whether the NOFORCE option caused that
     position to be overruled

* Function: pos-visible-in-window-p &optional POSITION WINDOW

       This function returns `t' if POSITION is currently visible on the
     screen in WINDOW, or if POSITION is currently out of view only
     because it has been scrolled horizontally.  The function returns
     `nil' if POSITION is scrolled vertically out of view.  POSITION
     defaults to the current point; WINDOW, to the selected window.

          (pos-visible-in-window-p (point) (selected-window))

      The `pos-visible-in-window-p' function will return `t' if POSITION
     is out of view only because it has been scrolled horizontally.
     Here is how you could test whether POSITION is visible when there
     is horizontal scrolling:

          (save-excursion 
            (goto-char POSITION)
            (and 
             (>= (- (current-column) (window-hscroll WINDOW)) 0)
             (< (- (current-column) (window-hscroll WINDOW))
                (window-width WINDOW))))

▶1f◀
File: lispref  Node: Vertical Scrolling, Prev: Window Point, Up: Windows, Next: Horizontal Scrolling

Vertical Scrolling
==================

  Vertical scrolling changes the value returned by `window-start'; and
may change the value of `window-point' to keep it on the screen.

  In the commands `scroll-up' and `scroll-down', the directions `up' and
`down' refer to the motion of the text in the buffer at which you are
looking through the window.  You can imagine that the text is written on
a long roll of paper and that the scrolling commands move the paper up
and down.  Thus, if you are looking at text in the middle of a buffer
and repeatedly call `scroll-down', you will eventually see the beginning
of the buffer.

  Some people have argued that the converse convention be used: that the
user imagine that the text does not move but the window does.  Then
`down' commands would take you to the end of the buffer.  However, the
position of a window on your terminal does not move, and short scrolling
commands clearly do move the text up or down, so the chosen convention
makes more sense.  Repeated `down' commands bring you to the beginning
of the buffer.

* Command: scroll-up &optional COUNT

       This function scrolls text in the selected window upward COUNT
     lines.  COUNT defaults to `nil'.  If COUNT is `nil', then the
     length of the scroll is `next-screen-context-lines' lines less than
     the height of the window in usable lines.

       `scroll-up' returns `nil'.

* Command: scroll-down &optional COUNT

       This function scrolls the text in the selected window downward
     COUNT lines.  If COUNT is omitted, then the length of the scroll is
     `next-screen-context-lines' lines less than the height of the
     window in usable lines.

       `scroll-down' returns `nil'.

* Command: scroll-other-window &optional COUNT

       This function scrolls the text in the next window upward COUNT
     lines.  The next window is the one below (or to the right of) the
     current one; or the one at the top (right hand side) of the screen
     if the current one is at the bottom (left hand side).  More
     precisely, it is the window returned by `(next-window)'.

       When the minibuffer is active, this command will attempt to
     scroll the minibuffer if that is the next window.  If the
     minibuffer contains just one line, that line will be redisplayed
     after the echo area momentarily displays the message ``Beginning of
     buffer''.

     Also, see `minibuffer-scroll-window' in *Note Minibuffer Odds and
     Ends::.

* User Option: scroll-step

       The value of this variable is the number of lines Emacs should
     try scrolling a window, when point moves out of the window.  If
     this value is zero, the line that the point is on always goes to
     the center of the window after the point moves off screen.

       If scrolling by `scroll-step' would fail to bring point back on
     screen, then Emacs centers point anyway.

* User Option: next-screen-context-lines

       The value of this variable is the number of lines of continuity
     to retain when scrolling by screenfulls.  This means that when
     `scroll-up' executes, this many lines that had been visible at the
     bottom of the screen are now visible at the top of the screen.  The
     default value is `2'.

* Command: recenter &optional COUNT

       This function re-positions the text displayed in the selected
     window.  It puts the line containing point COUNT lines down from
     the top of the window and redraws only that window.  The text
     displayed in the other windows does not move.

       If COUNT is `nil', then it puts the line containing point in the
     center of the window, and redisplays the entire screen.  If COUNT
     is a non-`nil' list, then it puts the line containing point in the
     center of the window, but only redisplays as much of the window as
     necessary to position the text---only with `nil' does it redisplay
     the entire screen.

       When `recenter' is called interactively, Emacs sets COUNT to the
     unprocessed prefix argument.  Thus, typing `C-u' as the prefix sets
     the prefix argument to a non-`nil' list, while typing `C-u 4'
     positions the line four lines from the top.

       Typing `C-u 0 C-l' positions the current line at the top of the
     screen.  This action is so very handy that some people bind the
     command to a function key.  For example,

          (defun line-to-top-of-screen ()
            "Moves line point is on to top of screen.
          Replaces three keystroke sequence C-u 0 C-l."
            (interactive) 
            (recenter 0))

          ;; Bind function key PF6 on AAA terminal.
          (global-set-key "\eOF" 'line-to-top-of-screen)  

▶1f◀
File: lispref  Node: Horizontal Scrolling, Prev: Vertical Scrolling, Up: Windows, Next: Window Size

Horizontal Scrolling
====================
  
  Horizontal scrolling is not like vertical scrolling; it is implemented
at a lower level and does not change the value returned by
`window-start'.  It leaves out certain columns of the display and shows
other columns (that may have no text in them).  Usually, horizontal
scrolling starts with the leftmost column at the left edge of the
window; in this case, the columns displayed cannot be scrolled to the
right.  Columns in the display can be scrolled to the right only after
they have first been scrolled left.  There is no limit to left scrolling
except the size of the largest integer, but if you scroll farther than
the length of the longest line on the screen, you won't see anything but
emptiness.

* Command: scroll-left COUNT

       This function scrolls the selected window COUNT columns to the
     left.  It scrolls to the right if COUNT is negative.

* Command: scroll-right COUNT

       This function scrolls the selected window COUNT columns to the
     right.  It scrolls to the left if COUNT is negative.

       Once you scroll a window as far right as it can go, trying to
     scroll any farther has no effect.

* Function: window-hscroll &optional WINDOW

       This function returns the number of columns by which WINDOW is
     scrolled from the left margin.

       When the leftmost column is at the left edge of the window, this
     function returns 0.  The value is never negative.

       If WINDOW is `nil', the selected window is used.
          (window-hscroll)
               => 0

* Function: set-window-hscroll WINDOW COLUMNS

       This function sets the number of columns from the left margin
     that WINDOW is scrolled to the value of COLUMNS.  COLUMNS should be
     zero or positive.

       The value returned is COLUMNS.

          (set-window-hscroll (selected-window)  10)
               => 10

▶1f◀
File: lispref  Node: Window Size, Prev: Horizontal Scrolling, Up: Windows, Next: Window Configurations

Window Size
===========

  The window size functions fit into two classes: high level commands
that change the size of windows; and low level functions that access
window size.  Emacs does not permit overlapping windows or gaps, so
enlarging one window affects all of them.

* Command: enlarge-window SIZE &optional HORIZONTAL

       This function makes the selected window SIZE lines bigger,
     stealing lines from neighboring windows.  It generally tries to
     steal equal numbers of lines from the other windows.  If a window
     from which lines are stolen shrinks below `window-min-height', then
     that window disappears.

       If HORIZONTAL is non-`nil', then this function makes WINDOW wider
     by SIZE columns, stealing columns as it does lines.  If a window
     from which lines are stolen shrinks below `window-min-width', then
     that window disappears.

       If the screen is smaller than SIZE lines (or columns), then the
     function makes the window occupy the entire height (or width) of
     the screen.

       If SIZE is negative, this function shrinks window instead by
     -SIZE.

       `enlarge-window' returns `nil'.

* Command: enlarge-window-horizontally COLUMNS

       This function makes the selected window COLUMNS wider.

       It is simply an interface to `enlarge-window'.

* Command: shrink-window SIZE &optional HORIZONTAL

       This function is the exact analog to `enlarge-window', making the
     selected window smaller by giving lines (or columns) to the other
     windows.  If the window shrinks below `window-min-height', then it
     disappears.  If SIZE is negative, it enlarges instead by -SIZE.

* Command: shrink-window-horizontally COLUMNS

       This function makes the selected window COLUMNS narrower.

       This function is simply an interface to `shrink-window'.

  The following three functions return size information about a window.

* Function: window-height &optional WINDOW

       This function returns the number of lines in WINDOW (including
     its mode line).  If WINDOW fills the entire screen, this is one
     less than what `(screen-height)' would return (since the last line
     is always reserved for the minibuffer).

       If WINDOW is `nil', the function uses the selected window.

          (window-height)
               => 49

* Function: window-width &optional WINDOW

       This function returns the number of columns in WINDOW.  If WINDOW
     fills the entire screen, this is what `(screen-width)' would
     return.

       If WINDOW is `nil', the function uses the selected window.

          (window-width)
               => 80

* Function: window-edges &optional WINDOW

       This function returns a list of the edge coordinates of WINDOW.
     The order of the list is: `(LEFT TOP RIGHT BOTTOM)', all relative
     to 0, 0 at the top left corner of the screen.

       RIGHT is one more than the rightmost column used by WINDOW, and
     BOTTOM is one more than the bottommost row used by WINDOW and its
     mode-line.

       For example, the edges of the following window are `0 0 5 8'.
     (The mode line is shown with `xxxxxxxxx'.)

                     0    
                     _______
                  0 |       | 
                    |       |   
                    |       | 
                    xxxxxxxxx  5

                            8     

       If WINDOW fills the entire screen, then RIGHT and BOTTOM are the
     same as the values returned by `(window-width)' and
     `(window-height)' respectively.

       When the screen is split, and the window's right side is a
     separator, the value of RIGHT is the column number of the
     separator; conversely, if the window's left side is a separator,
     the value of LEFT is the column number of the separator;

       In the following example, the edges of the left window are `0 0 4
     5' and the edges of the right window are `4 0 8 5'.

                     ___ ___
                    |   |   |    
                    |   |   |    
                    |123|567|    
                    xxxxxxxxx 

       If WINDOW is `nil', the function uses the selected window.

          (window-edges (selected-window))
               => (0 0 80 49)

          (list 0 0 (window-width) (window-height))
               => (0 0 80 49)

  The following two variables constrain resizing functions to a minimum
height and width.

* User Option: window-min-height

       The value of this variable determines how short a window may
     become before it disappears.  When other windows are being
     enlarged, the window disappears when it becomes smaller than this.
     No window may be created that is smaller than this.  The absolute
     minimum height is 2 (allowing one line for the mode line, and one
     line for the buffer display); actions which change window sizes
     reset this variable to 2 if it is less than 2.

* User Option: window-min-width

       The value of this variable determines how narrow a window may
     become before it disappears.  When other windows are bing enlarged,
     the window disappears when it becomes narrower than this.  No
     window may be created that is narrower than this.  The absolute
     minimum width is 1; any value below that is ignored.

▶1f◀
File: lispref  Node: Window Configurations, Prev: Window Size, Up: Windows

Window Configurations
=====================

  Window configurations record entire screen layouts---all windows,
their sizes, which buffers they contain, what part of each buffer is
displayed, and the values of point and mark.

  Sometimes you want Emacs to restore the window configuration to some
saved past pattern.  This can be done with the following functions and
special forms.

  No one has implemented primitives to look inside of window
configurations.

* Function: current-window-configuration

       This function returns a new object representing Emacs's selected
     window configuration, namely the number of windows, their sizes and
     current buffers, which window is the selected window, and for each
     displayed buffer, where display starts, and the positions of the
     point and the mark.  An exception is made for the point in the
     current buffer, whose value is not saved.  An example of how it
     could be used with `set-window-configuration' to emulate
     `save-window-excursion' appears below with `save-window-excursion'.

* Function: set-window-configuration CONFIGURATION

       This function restores the configuration of Emacs's windows and
     buffers to the state specified by CONFIGURATION.  CONFIGURATION
     must be a value that `current-window-configuration' returned
     previously.

* Special form: save-window-excursion FORMS...

       This function executes FORMS in sequence, preserving window sizes
     and contents.  It restores each window with the same start of
     display of its buffer.  It does not restore the value of point in
     the current buffer (use `save-excursion' for that).

       This function returns the value of the final form in FORMS.

          (split-window)
               => #<window 25 on control-structure.texinfo>
          (setq w (selected-window))
               => #<window 19 on control-structure.texinfo>
          (save-window-excursion
             (delete-other-windows w)
             (switch-to-buffer "foo")
             'do-something)
               => do-something
▶1f◀
File: lispref  Node: Positions, Prev: Windows, Up: Top, Next: Markers

Positions
*********

  A "position" is a number denoting the offset of a character from the
beginning of a buffer.  The position of the first character in a buffer
is `1'.  Positions are always between two characters (or before the
first character in the buffer, or after the last character of the
buffer).  The character referred to as *at* or *after* a position is
always the one immediately following the position.

  Markers are another way to represent positions; they relocate
automatically when text is inserted or deleted so they stay with the
surrounding characters.  *Note Markers::.

* Menu:

* Point::                       Special position
* Motion::                      Changing point
* Excursions::                  Temporary motion and buffer changes
* Clipping Restrictions::       Restricting point to a region

▶1f◀
File: lispref  Node: Point, Prev: Positions, Up: Positions, Next: Motion

Point
=====

  "Point" is a special buffer position used by many editing commands,
including the self-inserting typed characters and text insertion
functions.  Other commands move point through the text, so that you can
edit at different places in it.

  Like other positions, point is always between two characters (or
before the first character in the buffer, or after the last character of
the buffer).  Many terminals display the cursor over the character that
immediately follows point; on such terminals, point is between the
character on which the cursor sits and the preceding character.

  Each buffer has a value of point, which is independent of the value of
point in other buffers.  The value of point is always between `1' and
the buffer size plus one (*Note Buffer Contents::).  If there is a
clipping restriction in effect (*Note Clipping Restrictions::), then
point is always constrained to fall between the restriction boundaries.

  Each window also has a value of point, which is independent of the
value of point in other windows on the same buffer.  This is why point
can be in different places in each window that shows a given buffer.
When a buffer appears in only one window, the buffer's point and the
window's point normally have the same value, so the distinction is
rarely important.  *Note Window Point::, for more details.

* Function: point

       This function returns the position of point in the current
     buffer, as an integer.

          (point)
               => 175

* Function: bobp

       This function returns `t' if the point is at the beginning of the
     buffer.  If a clipping restriction is in effect, this means the
     beginning of the visible text.  Also, see `point-min' in *Note
     Buffer Contents::.

* Function: eobp

       This function returns `t' if point is at the end of the buffer.
     If a clipping restriction is in effect, this means the end of
     visible text.  Also, see `point-max' in *Note Buffer Contents::.

* Function: bolp

       This function returns `t' if the point is at the beginning of a
     line.

* Function: eolp

       This function returns `t' if the point is at the end of a line.
     The end of the buffer is always considered the end of a line.

  Many functions are provided to look at the characters around point.
Three simple functions are described here.  Also, *Note Searching and
Matching::.

* Function: char-after POSITION

       This function returns the character in the current buffer at
     position POSITION.  If POSITION does not specify a character in the
     buffer, then it returns `nil'.

       (Remember that point is always between characters or before the
     first character in a buffer; therefore, on many terminals, the
     character returned by `char-after' is the character the cursor is
     over.)

       In the example, the first character in the buffer is `@'.
          (char-to-string (char-after 1))
               => "@"

* Function: following-char

       This function returns the character following point in the
     current buffer.  This is similar to `(char-after (point))'.
     However, point is the last position of the buffer, then the result
     of `following-char' is `0'.

       In this example, the point is between the `a' and the `c'.

          Gentlemen may cry ``Pe-!-ace! Peace!,'' but there is no peace.

          (char-to-string (preceding-char))
               => "a"
          (char-to-string (following-char))
               => "c"

* Function: preceding-char

        This function returns the character preceding point in the
     current buffer.  See `following-char' for an example.  If point is
     the first position of the buffer, then the result of
     `preceding-char' is `0'.

▶1f◀