home *** CD-ROM | disk | FTP | other *** search
-
- ΓòÉΓòÉΓòÉ 1. Title page ΓòÉΓòÉΓòÉ
-
- GNU Emacs Lisp Reference Manual
-
- GNU Emacs Version 18
-
- for Unix Users
-
- Edition 1.03, December 1990
-
- by Bil Lewis, Dan LaLiberte, and the GNU Manual Group
-
- Copyright (C) 1990 Free Software Foundation, Inc.
-
- This is edition 1.03 of the GNU Emacs Lisp Reference Manual, for Emacs Version
- 18,
- December 1990.
- ISBN 1-882114-10-8.
-
- Published by the Free Software Foundation,
- 675 Massachusetts Avenue,
- Cambridge, MA 02139 USA
-
- 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.
-
- Cover art by Etienne Suvasa.
-
-
- ΓòÉΓòÉΓòÉ 2. Top ΓòÉΓòÉΓòÉ
-
- This Info file contains edition 1.03 of the GNU Emacs Lisp Reference Manual.
-
-
- ΓòÉΓòÉΓòÉ 3. GNU Emacs General Public License ΓòÉΓòÉΓòÉ
-
- (Clarified 11 Feb 1988)
-
- The license agreements of most software companies keep you at the mercy of
- those companies. By contrast, our general public license is intended to give
- everyone the right to share GNU Emacs. To make sure that you get the rights we
- want you to have, we need to make restrictions that forbid anyone to deny you
- these rights or to ask you to surrender the rights. Hence this license
- agreement.
-
- Specifically, we want to make sure that you have the right to give away copies
- of Emacs, that you receive source code or else can get it if you want it, that
- you can change Emacs or use pieces of it in new free programs, and that you
- know you can do these things.
-
- To make sure that everyone has such rights, we have to forbid you to deprive
- anyone else of these rights. For example, if you distribute copies of Emacs,
- you must give the recipients all the rights that you have. You must make sure
- that they, too, receive or can get the source code. And you must tell them
- their rights.
-
- Also, for our own protection, we must make certain that everyone finds out
- that there is no warranty for GNU Emacs. If Emacs is modified by someone else
- and passed on, we want its recipients to know that what they have is not what
- we distributed, so that any problems introduced by others will not reflect on
- our reputation.
-
- Therefore we (Richard Stallman and the Free Software Foundation, Inc.) make
- the following terms which say what you must do to be allowed to distribute or
- change GNU Emacs.
-
-
- ΓòÉΓòÉΓòÉ 3.1. Copying Policies ΓòÉΓòÉΓòÉ
-
- 1. You may copy and distribute verbatim copies of GNU Emacs source code as you
- receive it, in any medium, provided that you conspicuously and
- appropriately publish on each file a valid copyright notice ``Copyright (C)
- 1988 Free Software Foundation, Inc.'' (or with whatever year is
- appropriate); keep intact the notices on all files that refer to this
- License Agreement and to the absence of any warranty; and give any other
- recipients of the GNU Emacs program a copy of this License Agreement along
- with the program. You may charge a distribution fee for the physical act
- of transferring a copy.
-
- 2. You may modify your copy or copies of GNU Emacs source code or any portion
- of it, and copy and distribute such modifications under the terms of
- Paragraph 1 above, provided that you also do the following:
-
- o cause the modified files to carry prominent notices stating who last
- changed such files and the date of any change; and
-
- o cause the whole of any work that you distribute or publish, that in whole
- or in part contains or is a derivative of GNU Emacs or any part thereof,
- to be licensed at no charge to all third parties on terms identical to
- those contained in this License Agreement (except that you may choose to
- grant more extensive warranty protection to some or all third parties, at
- your option).
-
- o if the modified program serves as a text editor, cause it, when started
- running in the simplest and usual way, to print an announcement including
- a valid copyright notice ``Copyright (C) 1988 Free Software Foundation,
- Inc.'' (or with the year that is appropriate), saying that there is no
- warranty (or else, saying that you provide a warranty) and that users may
- redistribute the program under these conditions, and telling the user how
- to view a copy of this License Agreement.
-
- o You may charge a distribution fee for the physical act of transferring a
- copy, and you may at your option offer warranty protection in exchange for
- a fee.
-
- Mere aggregation of another unrelated program with this program (or its
- derivative) on a volume of a storage or distribution medium does not bring
- the other program under the scope of these terms.
-
- 3. You may copy and distribute GNU Emacs (or a portion or derivative of it,
- under Paragraph 2) in object code or executable form under the terms of
- Paragraphs 1 and 2 above provided that you also do one of the following:
-
- o accompany it with the complete corresponding machine-readable source code,
- which must be distributed under the terms of Paragraphs 1 and 2 above; or,
-
- o accompany it with a written offer, valid for at least three years, to give
- any third party free (except for a nominal shipping charge) a complete
- machine-readable copy of the corresponding source code, to be distributed
- under the terms of Paragraphs 1 and 2 above; or,
-
- o accompany it with the information you received as to where the
- corresponding source code may be obtained. (This alternative is allowed
- only for noncommercial distribution and only if you received the program
- in object code or executable form alone.)
-
- For an executable file, complete source code means all the source code for
- all modules it contains; but, as a special exception, it need not include
- source code for modules which are standard libraries that accompany the
- operating system on which the executable file runs.
-
- 4. You may not copy, sublicense, distribute or transfer GNU Emacs except as
- expressly provided under this License Agreement. Any attempt otherwise to
- copy, sublicense, distribute or transfer GNU Emacs is void and your rights
- to use GNU Emacs under this License agreement shall be automatically
- terminated. However, parties who have received computer software programs
- from you with this License Agreement will not have their licenses
- terminated so long as such parties remain in full compliance.
-
- 5. If you wish to incorporate parts of GNU Emacs into other free programs
- whose distribution conditions are different, write to the Free Software
- Foundation. We have not yet worked out a simple rule that can be stated
- here, but we will often permit this. We will be guided by the two goals of
- preserving the free status of all derivatives of our free software and of
- promoting the sharing and reuse of software.
-
- Your comments and suggestions about our licensing policies and our software are
- welcome! Please contact the Free Software Foundation, Inc., 675 Mass Ave,
- Cambridge, MA 02139.
-
-
- ΓòÉΓòÉΓòÉ 3.2. NO WARRANTY ΓòÉΓòÉΓòÉ
-
- BECAUSE GNU EMACS IS LICENSED FREE OF CHARGE, WE PROVIDE ABSOLUTELY NO
- WARRANTY, TO THE EXTENT PERMITTED BY APPLICABLE STATE LAW. EXCEPT WHEN
- OTHERWISE STATED IN WRITING, FREE SOFTWARE FOUNDATION, INC, RICHARD M. STALLMAN
- AND/OR OTHER PARTIES PROVIDE GNU EMACS ``AS IS'' WITHOUT WARRANTY OF ANY KIND,
- EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE
- RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
- GNU EMACS PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
- SERVICING, REPAIR OR CORRECTION.
-
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL FREE SOFTWARE FOUNDATION,
- INC., RICHARD M. STALLMAN, AND/OR ANY OTHER PARTY WHO MAY MODIFY AND
- REDISTRIBUTE GNU EMACS AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
- INCLUDING ANY LOST PROFITS, LOST MONIES, OR OTHER SPECIAL, INCIDENTAL OR
- CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE (INCLUDING BUT
- NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES
- SUSTAINED BY THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH PROGRAMS
- NOT DISTRIBUTED BY FREE SOFTWARE FOUNDATION, INC.) THE PROGRAM, EVEN IF YOU
- HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES, OR FOR ANY CLAIM BY ANY
- OTHER PARTY.
-
-
- ΓòÉΓòÉΓòÉ 4. Introduction ΓòÉΓòÉΓòÉ
-
- Most of the GNU Emacs text editor is written in the programming language
- called Emacs Lisp. You can write new code in Emacs Lisp and install it as an
- extension to the editor. However, Emacs Lisp is more than a mere ``extension
- language''; it is a full computer programming language in its own right. You
- can use it as you would any other programming language.
-
- Because Emacs Lisp is designed for use in an editor, it has special features
- for scanning and parsing text as well as features for handling files, buffers,
- displays, subprocesses, and so on. Emacs Lisp is closely integrated with the
- editing facilities; thus, editing commands are functions that can also
- conveniently be called from Lisp programs, and parameters for customization are
- ordinary Lisp variables.
-
- This manual describes Emacs Lisp, presuming considerable familiarity with the
- use of Emacs for editing. (See The GNU Emacs Manual, for this basic
- information.) Generally speaking, the earlier chapters describe features of
- Emacs Lisp that have counterparts in many programming languages, and later
- chapters describe features that are peculiar to Emacs Lisp or relate
- specifically to editing.
-
- This is edition 1.02.
-
-
- ΓòÉΓòÉΓòÉ 4.1. Caveats ΓòÉΓòÉΓòÉ
-
- This manual has gone through numerous drafts. It is nearly complete but not
- flawless. There are a few sections which are not included, either because we
- consider them secondary (such as most of the individual modes) or because they
- are yet to be written.
-
- Because we are not able to deal with them completely, we have left out several
- parts intentionally. This includes most references to VMS and all information
- relating to X Windows and Sunview. The functions for using X Windows will in
- any case be entirely different in version 19. (The Free Software Foundation
- expends no effort on support for Sunview, since we believe users should use
- free X Windows rather than proprietary window systems.)
-
- The manual should be fully correct in what it does cover, and it is therefore
- open to criticism on anything it says---from specific examples and descriptive
- text, to the ordering of chapters and sections. If something is confusing, or
- you find that you have to look at the sources or experiment to learn something
- not covered in the manual, then perhaps the manual should be fixed. Please let
- us know.
-
- As you use this manual, we ask that you send corrections as soon as you find
- them. If you think of a simple, real life example for a function or group of
- functions, please make an effort to write it up and send it in. Please
- reference any comments to the node name and function or variable name, as
- appropriate.
-
- Please mail comments and corrections to lisp-manual-bugs@prep.ai.mit.edu.
-
- --Bil Lewis, Dan LaLiberte, Richard Stallman
-
-
- ΓòÉΓòÉΓòÉ 4.2. Lisp History ΓòÉΓòÉΓòÉ
-
- Lisp (LISt Processing language) was first developed in the late 1950s at the
- Massachusetts Institute of Technology for research in artificial intelligence.
- The great power of the Lisp language makes it superior for other purposes as
- well, such as writing editing commands.
-
- Dozens of Lisp implementations have been built over the years, each with its
- own idiosyncrasies. Many of them were inspired by Maclisp, which was written
- in the 1960's at MIT's Project MAC. Eventually the implementors of the
- descendents of Maclisp came together and developed a standard for Lisp systems,
- called Common Lisp.
-
- GNU Emacs Lisp is largely inspired by Maclisp, and a little by Common Lisp.
- If you know Common Lisp, you will notice many similarities. However, many of
- the features of Common Lisp have been omitted or simplified in order to reduce
- the memory requirements of GNU Emacs. Sometimes the simplifications are so
- drastic that a Common Lisp user might be very confused. We will occasionally
- point out how GNU Emacs Lisp differs from Common Lisp. If you don't know
- Common Lisp, don't worry about it; this manual is self-contained.
-
-
- ΓòÉΓòÉΓòÉ 4.3. Conventions ΓòÉΓòÉΓòÉ
-
- This section explains the notational conventions that are used in this manual.
- You may want to skip this section and refer back to it later.
-
-
- ΓòÉΓòÉΓòÉ 4.3.1. Some Terms ΓòÉΓòÉΓòÉ
-
- Throughout this manual, the phrases ``the Lisp reader'' and ``the Lisp
- printer'' are used to refer to those routines in Lisp that convert textual
- representations of Lisp objects into actual objects, and vice versa. See
- Printed Representation, for more details. You, the person reading this manual,
- are assumed to be ``the programmer'' and are addressed as ``you''. ``The
- user'' is the person who uses the code that you write.
-
- Examples of Lisp code appear in this font or form: (list 1 2 3). Names that
- represent arguments or metasyntactic variables appear in this font or form:
- first-number.
-
-
- ΓòÉΓòÉΓòÉ 4.3.2. nil and t ΓòÉΓòÉΓòÉ
-
- In Lisp, the symbol nil is overloaded with three meanings: it is a symbol with
- the name `nil'; it is the logical truth value false; and it is the empty
- list---the list of zero elements. When used as a variable, nil always has the
- value nil.
-
- As far as the Lisp reader is concerned, `()' and `nil' are identical: they
- stand for the same object, the symbol nil. The different ways of writing the
- symbol are intended entirely for human readers. After the Lisp reader has read
- either `()' or `nil', there is no way to determine which representation was
- actually written by the programmer.
-
- In this manual, we use () when we wish to emphasize that it means the empty
- list, and we use nil when we wish to emphasize that it means the truth value
- false. That is a good convention to use in Lisp programs also.
-
- (cons 'foo ()) ; Emphasize the empty list
- (not nil) ; Emphasize the truth value false
-
- In context where a truth value is expected, any non-nil value is considered to
- be true. However, t is the preferred way to represent the truth value true.
- When you need to choose a value which represents true, and there is no other
- basis for choosing, use t. The symbol t always has value t.
-
- In Emacs Lisp, nil and t are special symbols that always evaluate to
- themselves. This is so that you do not need to quote them to use them as
- constants in a program. An attempt to change their values results in a
- setting-constant error. See Accessing Variables.
-
-
- ΓòÉΓòÉΓòÉ 4.3.3. Evaluation Notation ΓòÉΓòÉΓòÉ
-
- When you evaluate a piece of Lisp code, it produces a result. In the examples
- in this manual, this is indicated with `=>':
-
- (car '(1 2))
- => 1
-
- You can read this as ``(car '(1 2)) evaluates to 1''.
-
- When a form is a macro call, it expands into a new form for Lisp to evaluate.
- We show the result of the expansion with `->'. We may or may not show the
- actual result of the evaluation of the expanded form.
-
- (third '(a b c))
- -> (car (cdr (cdr '(a b c))))
- => c
-
- Sometimes to help describe one form we show another form which produces
- identical results. The exact equivalence of two forms is indicated with `=='.
-
- (make-sparse-keymap) == (list 'keymap)
-
-
- ΓòÉΓòÉΓòÉ 4.3.4. Printing Notation ΓòÉΓòÉΓòÉ
-
- Many of the examples in this manual print text when they are evaluated. If
- you execute the code from an example in a Lisp Interaction buffer (such as the
- buffer `*scratch*'), the printed text is inserted into the buffer. If the
- example is executed by other means (such as by evaluating the function
- eval-region), the text printed is usually displayed in the echo area. You
- should be aware that text displayed in the echo area is truncated to a single
- line.
-
- In examples that print text, the printed text is indicated with `-|',
- irrespective of how the form is executed. The value returned by evaluating the
- form (here bar) follows on a separate line.
-
- (progn (print 'foo) (print 'bar))
- -| foo
- -| bar
- => bar
-
-
- ΓòÉΓòÉΓòÉ 4.3.5. Error Messages ΓòÉΓòÉΓòÉ
-
- Some examples cause errors to be signaled. In them, the error message (which
- always appears in the echo area) is shown on a line starting with `error-->'.
- Note that `error-->' itself does not appear in the echo area.
-
- (+ 23 'x)
- error--> Wrong type argument: integer-or-marker-p, x
-
-
- ΓòÉΓòÉΓòÉ 4.3.6. Buffer Text Notation ΓòÉΓòÉΓòÉ
-
- Some examples show modifications to text in a buffer, with ``before'' and
- ``after'' versions of the text. In such cases, the entire contents of the
- buffer in question are included between two lines of dashes containing the
- buffer name. In addition, the location of point is shown as `-!-'. (The
- symbol for point, of course, is not part of the text in the buffer; it
- indicates the place between two characters where point is located.)
-
- ---------- Buffer: foo ----------
- This is the -!-contents of foo.
- ---------- Buffer: foo ----------
-
- (insert "changed ")
- => nil
- ---------- Buffer: foo ----------
- This is the changed -!-contents of foo.
- ---------- Buffer: foo ----------
-
-
- ΓòÉΓòÉΓòÉ 4.3.7. Format of Descriptions ΓòÉΓòÉΓòÉ
-
- Functions, variables, macros, commands, user options, and special forms are
- described in this manual in a uniform format. The first line of a description
- contains the name of the item followed by its arguments, if any. The
- category---function, variable, or whatever---appears at the beginning of the
- line. The description follows on succeeding lines, sometimes with examples.
-
-
- ΓòÉΓòÉΓòÉ 4.3.7.1. A Sample Function Description ΓòÉΓòÉΓòÉ
-
- In a function description, the name of the function being described appears
- first. It is followed on the same line by a list of parameters. The names used
- for the parameters are also used in the body of the description.
-
- The appearance of the keyword &optional in the parameter list indicates that
- the arguments for subsequent parameters may be omitted (omitted parameters
- default to nil). Do not write &optional when you call the function.
-
- The keyword &rest (which will always be followed by a single parameter)
- indicates that any number of arguments can follow. The value of the single
- following parameter will be a list of all these arguments. Do not write &rest
- when you call the function.
-
- Here is a description of an imaginary function foo:
-
- -- Function: foo integer1 &optional integer2 &rest integers
- The function foo subtracts integer1 from integer2, then adds all the rest of
- the arguments to the result. If integer2 is not supplied, then the number 19
- is used by default.
-
- (foo 1 5 3 9)
- => 16
- (foo 5)
- => 14
-
- More generally,
-
- (foo w x y...)
- ==
- (+ (- x w) y...)
-
- Any parameter whose name contains the name of a type (e.g., integer, integer1
- or buffer) is expected to be of that type. A plural of a type (such as
- buffers) often means a list of objects of that type. Parameters named object
- may be of any type. (See Types of Lisp Object, for a list of Emacs object
- types.) Parameters with other sorts of names (e.g., new-file) are discussed
- specifically in the description of the function. In some sections, features
- common to parameters of several functions are described at the beginning.
-
- See Lambda Expressions, for a more complete description of optional and rest
- arguments.
-
- Command, macro, and special form descriptions have the same format, but the
- word `Function' is replaced by `Command', `Macro', or `Special Form',
- respectively. Commands are simply functions that may be called interactively;
- macros process their arguments differently from functions (the arguments are
- not evaluated), but are presented the same way.
-
- Special form descriptions use a more complex notation to specify optional and
- repeated parameters because they can break the argument list down into separate
- arguments in more complicated ways. `[optional-arg]' means that optional-arg is
- optional and `repeated-args...' stands for zero or more arguments. Parentheses
- are used when several arguments are grouped into additional levels of list
- structure. Here is an example:
-
- -- Special Form: count-loop (var [from to [inc]]) body...
- This imaginary special form implements a loop that executes the body forms and
- then increments the variable var on each iteration. On the first iteration,
- the variable has the value from; on subsequent iterations, it is incremented by
- 1 (or by inc if that is given). The loop exits before executing body if var
- equals to. Here is an example:
-
- (count-loop (i 0 10)
- (prin1 i) (princ " ")
- (prin1 (aref vector i)) (terpri))
-
- If from and to are omitted, then var is bound to nil before the loop begins,
- and the loop exits if var is non-nil at the beginning of an iteration. Here is
- an example:
-
- (count-loop (done)
- (if (pending)
- (fixit)
- (setq done t)))
-
- In this special form, the arguments from and to are optional, but must both be
- present or both absent. If they are present, inc may optionally be specified
- as well. These arguments are grouped with the argument var into a list, to
- distinguish them from body, which includes all remaining elements of the form.
-
-
- ΓòÉΓòÉΓòÉ 4.3.7.2. A Sample Variable Description ΓòÉΓòÉΓòÉ
-
- A variable is a name that can hold a value. Although any variable can be set
- by the user, certain variables that exist specifically so that users can change
- them are called user options. Ordinary variables and user options are
- described using a format like that for functions except that there are no
- arguments.
-
- Here is a description of the imaginary electric-future-map variable.
-
- -- Variable: electric-future-map
- The value of this variable is a full keymap used by electric command future
- mode. The functions in this map will allow you to edit commands you have not
- yet thought about executing.
-
- User option descriptions have the same format, but `Variable' is replaced by
- `User Option'.
-
-
- ΓòÉΓòÉΓòÉ 4.4. Acknowledgements ΓòÉΓòÉΓòÉ
-
- This manual was written by Robert Krawitz, Bil Lewis, Dan LaLiberte, Richard
- M. Stallman and Chris Welty, the volunteers of the GNU manual group, in an
- effort extending over several years. Robert J. Chassell helped to review and
- edit the manual, with the support of the Defense Advanced Research Projects
- Agency, ARPA Order 6082, arranged by Warren A. Hunt, Jr. of Computational
- Logic, Inc.
-
- Corrections were supplied by Karl Berry, Bard Bloom, David Boyes, Alan
- Carroll, David A. Duff, Beverly Erlebacher, David Eckelkamp, Eirik Fuller, Eric
- Hanchrow, George Hartzell, Nathan Hess, Dan Jacobson, Jak Kirman, Bob Knighten,
- Frederick M. Korz, Joe Lammens, K. Richard Magill, Brian Marick, Roland
- McGrath, Skip Montanaro, John Gardiner Myers, Arnold D. Robbins, Raul Rockwell,
- Shinichirou Sugou, Kimmo Suominen, Edward Tharp, Bill Trost, Jean White,
- Matthew Wilding, Carl Witty, Dale Worley, Rusty Wright, and David D. Zuhn.
-
-
- ΓòÉΓòÉΓòÉ 5. Lisp Data Types ΓòÉΓòÉΓòÉ
-
- A Lisp object is a piece of data used and manipulated by Lisp programs. For
- our purposes, a type or data type is a set of possible objects.
-
- Every object belongs to at least one type. Objects of the same type have
- similar structures and may usually be used in the same contexts. Types can
- overlap, and objects can belong to two or more types. Consequently, we can ask
- whether an object belongs to a particular type, but not for ``the'' type of an
- object.
-
- A few fundamental object types are built into Emacs. These, from which all
- other types are constructed, are called primitive types. They include integer,
- cons, symbol, string, vector, subr and several special types, such as buffer,
- that are related to editing. (See Editing Types.)
-
- While an object may be a member of more than one type, every object is a
- member of exactly one primitive type. The primitive type of an object is
- stored with the object's data. A Lisp function is provided for each primitive
- type to check whether an object is a member of that type.
-
- Note that Lisp is unlike many other languages in that Lisp objects are
- ``self-typing'': the primitive type of the object is implicit in the object
- itself. For example, if an object is a vector, it cannot be treated as a
- number because Lisp knows it is a vector, not a number. In most languages, the
- programmer must declare the data type of each variable, and the type is known
- by the compiler but not represented in the data. Such type declarations do not
- exist in Emacs Lisp.
-
- This chapter describes the purpose, printed representation, and read syntax of
- each of the standard types in GNU Emacs Lisp. Details on how to use these
- types can be found in later chapters.
-
-
- ΓòÉΓòÉΓòÉ 5.1. Printed Representation and Read Syntax ΓòÉΓòÉΓòÉ
-
- The printed representation of an object is the format of the output generated
- by the Lisp printer (the function print) for that object. The read syntax of
- an object is the format of the input accepted by the Lisp reader (the function
- read) for that object. Most objects have more than one possible read syntax.
- Some types of object have no read syntax; except in these cases, the printed
- representation of an object is also a read syntax for it.
-
- In other languages, an expression is text; it has no other form. In Lisp, an
- expression is primarily a Lisp object and only secondarily the text that is the
- object's read syntax. Often there is no need to emphasize this distinction,
- but you must keep it in the back of your mind, or you will occasionally be very
- confused.
-
- Every type has a printed representation. Some types have no read syntax,
- since it may not make sense to enter objects of these types directly in a Lisp
- program. For example, the buffer type does not have a read syntax. Objects of
- these types are printed in hash notation: the characters `#<' followed by a
- descriptive string (typically the type name followed by the name of the
- object), and closed with a matching `>'. Hash notation cannot be read at all,
- so the Lisp reader signals the error invalid-read-syntax whenever a `#' is
- encountered.
-
- (current-buffer)
- => #<buffer objects.texi>
-
- When you evaluate an expression interactively, the Lisp interpreter first
- reads the textual representation of it, producing a Lisp object, and then
- evaluates that object (see Evaluation). However, evaluation and reading are
- separate activities. Reading returns the Lisp object represented by the text
- that is read; the object may or may not be evaluated later. See Input
- Functions, for a description of read, the basic function for reading objects.
-
-
- ΓòÉΓòÉΓòÉ 5.2. Comments ΓòÉΓòÉΓòÉ
-
- A comment is text that is written in a program only for the sake of humans
- that read the program, and that has no effect on the meaning of the program.
- In Lisp, a comment starts with a semicolon (`;') and continues to the end of
- line. Comments are discarded by the Lisp reader, and do not become part of the
- Lisp objects which represent the program within the Lisp system.
-
- We recommend these conventions for where to put comments and how to indent
- them:
-
- `;'
- Comments that start with a single semicolon, `;', should all be
- aligned to the same column on the right of the source code. Such
- comments usually explain how the code on the same line does its job.
- In Lisp mode and related modes, the M-; (indent-for-comment) command
- automatically inserts such a `;' in the right place, or aligns such a
- comment if it is already inserted.
-
- (The following examples are taken from the Emacs sources.)
-
- (setq base-version-list ; there was a base
- (assoc (substring fn 0 start-vn) ; version to which
- file-version-assoc-list)) ; this looks like
- ; a subversion
-
- `;;'
- Comments that start with two semicolons, `;;', should be aligned to
- the same level of indentation as the code. Such comments are used to
- describe the purpose of the following lines or the state of the
- program at that point. For example:
-
- (prog1 (setq auto-fill-hook
- ...
- ...
- ;; update mode-line
- (set-buffer-modified-p (buffer-modified-p))))
-
- These comments are also written before a function definition to
- explain what the function does and how to call it properly.
-
- `;;;'
- Comments that start with three semicolons, `;;;', should start at the
- left margin. Such comments are not used within function definitions,
- but are used to make more general comments. For example:
-
- ;;; This Lisp code is run in Emacs when it is to operate as
- ;;; a server for other processes.
-
- `;;;;'
- Comments that start with four semicolons, `;;;;', should be aligned
- to the left margin and are used for headings of major sections of a
- program. For example:
-
- ;;;; The kill ring
-
- The indentation commands of the Lisp modes in Emacs, such as M-;
- (indent-for-comment) and TAB (lisp-indent-line) automatically indent comments
- according to these conventions, depending on the the number of semicolons. See
- Manipulating Comments.
-
- Any character may be included in a comment, but it is advisable to precede a
- character with syntactic significance in Lisp (such as `\' or unpaired `(' or
- `)') with a `\', to prevent it from confusing the Emacs commands for editing
- Lisp.
-
-
- ΓòÉΓòÉΓòÉ 5.3. Programming Types ΓòÉΓòÉΓòÉ
-
- There are two general categories of types in Emacs Lisp: those having to do
- with Lisp programming, and those having to do with editing. The former are
- provided in many Lisp implementations, in one form or another. The latter are
- unique to Emacs Lisp.
-
-
- ΓòÉΓòÉΓòÉ 5.3.1. Number Type ΓòÉΓòÉΓòÉ
-
- Integers are the only kind of number in GNU Emacs Lisp, version 18. The range
- of values for integers is -8388608 to 8388607 (24 bits; i.e., -2**23 to 2**23 -
- 1) on most machines, but is 25 or 26 bits on some systems. It is important to
- note that the Emacs Lisp arithmetic functions do not check for overflow. Thus
- (1+ 8388607) is -8388608 on 24-bit implementations.
-
- Version 19 supports floating point numbers.
-
- The read syntax for numbers is a sequence of (base ten) digits with an
- optional sign. The printed representation produced by the Lisp interpreter
- never has a leading `+'.
-
- -1 ; The integer -1.
- 1 ; The integer 1.
- +1 ; Also the integer 1.
- 16777217 ; Also the integer 1! (on a 24-bit or 25-bit implementation)
-
- See Numbers, for more information.
-
-
- ΓòÉΓòÉΓòÉ 5.3.2. Character Type ΓòÉΓòÉΓòÉ
-
- A character in Emacs Lisp is nothing more than an integer. In other words,
- characters are represented by their eight-bit ASCII values. For example, the
- character A is represented as the integer 65. If an arbitrary integer is used
- as a character, only the lower eight bits are significant.
-
- Individual characters are not often used in programs. It is far more common
- to work with strings, which are sequences composed of characters. See String
- Type.
-
- Since characters are really integers, the printed representation of a
- character is a decimal number. This is also a possible read syntax for a
- character, but it is not convenient for that purpose. Therefore, Emacs Lisp
- provides a variety of read syntax formats, such as `?A' and `?\101', for
- entering characters. They all start with a question mark.
-
- The usual read syntax for alphanumeric characters is a question mark followed
- by the character; thus, `?A' for the character A, `?B' for the character B, and
- `?a' for the character a. For example:
-
- ?Q => 81
-
- ?q => 113
-
- The characters backspace, tab, newline, vertical tab, formfeed, return, and
- escape may be represented as `?\b', `?\t', `?\n', `?\v', `?\f', `?\r', `?\e',
- respectively. Those values are 8, 9, 10, 11, 12, 13, and 27 in decimal. Thus,
-
- ?\b => 8 ; backspace, BS, C-h
- ?\t => 9 ; tab, TAB, C-i
- ?\n => 10 ; newline, LFD, C-j
- ?\v => 11 ; vertical tab, C-k
- ?\f => 12 ; formfeed character, C-l
- ?\r => 13 ; carriage return, RET, C-m
- ?\e => 27 ; escape character, ESC, C-[
- ?\\ => 92 ; backslash character, \
-
- Control characters may be represented using yet another read syntax. This
- consists of a question mark followed by a backslash, caret, and the
- corresponding non-control character, in either upper or lower case. For
- example, either `?\^I' or `?\^i' may be used as the read syntax for the
- character C-i, the character whose value is 9.
-
- Instead of the `^', you can use `C-'; thus, `?\C-i' is equivalent to `?\^I',
- and `?\C-i' is equivalent to `?\^i'. For example:
-
- ?\^I => 9
-
- ?\C-I => 9
-
- The DEL key can be considered and written as Control-?:
-
- ?\^? => 127
-
- ?\C-? => 127
-
- When you represent control characters to be found in files or strings, we
- recommend the `^' syntax; but when you refer to keyboard input, we prefer the
- `C-' syntax. This does not affect the meaning of the program, but may guide
- the understanding of people who read it.
-
- A meta character is a character that has its eighth bit set. The read syntax
- for these characters is question mark, backslash, `M-', and the corresponding
- seven-bit character. For example, `?\M-A' stands for M-A, the character with
- code 193 (301 octal). The seven-bit character can be written directly or
- specified by any of the `\' escapes described above or below. Thus, M-A can be
- written as `?\M-A', or as `?\M-\101', or as `?\301'. Likewise, the character
- whose decimal printed representation is 130 (202 octal) can use any one of the
- following for its read syntax: `?\202', `?\M-\C-b', `?\C-\M-b', or `?\M-\002'.
- For example:
-
- ?\C-\M-b => 130 ?\M-\C-b => 130
-
- ?\^\M-b => 130 ?\M-\002 => 130
-
- Finally, the most general read syntax consists of a question mark followed by
- a backslash and the ASCII code for the character in octal (up to three octal
- digits); thus, `?\101' for the character A, `?\001' for the character C-a, and
- ?\002 for the character C-b. Although this syntax can represent any character,
- it is preferred only when the precise octal value is more important than the
- ASCII representation. (These sequences which start with backslash are also
- known as escape sequences, because backslash plays the role of an escape
- character, but they have nothing to do with the character ESC.)
-
- ?\012 => 10 ?\n => 10 ?\C-j => 10
-
- ?\101 => 65 ?A => 65
-
- ?\301 => 193 ?\M-A => 193 ?\M-\101 => 193
-
- A backslash is allowed, and harmless, preceding any character without a
- special escape meaning; thus, `?\A' is equivalent to `?A'. There is no reason
- to use a backslash before most such characters. However, any of the characters
- `()\|;'`"#.,' should be preceded by a backslash to avoid confusing the Emacs
- commands for editing Lisp code. Whitespace characters such as space, tab,
- newline and formfeed should also be preceded by a backslash. However, it is
- cleaner to use one of the easily readable escape sequences, such as `\t',
- instead of an actual control character such as a tab.
-
-
- ΓòÉΓòÉΓòÉ 5.3.3. Sequence Types ΓòÉΓòÉΓòÉ
-
- A sequence is a Lisp object that represents an ordered set of elements. There
- are two kinds of sequence in Emacs Lisp, lists and arrays. Thus, an object of
- type list or of type array is also considered a sequence.
-
- Arrays are further subdivided into strings and vectors. Vectors can hold
- elements of any type, but string elements must be characters---integers from 0
- to 255.
-
- Lists, strings and vectors are different, but they have important
- similarities. For example, all have a length l, and all have elements which
- can be indexed from zero to l minus one. Also, several functions, called
- sequence functions, accept any kind of sequence. For example, the function elt
- can be used to extract an element of a sequence, given its index. See Sequences
- Arrays Vectors.
-
- It is impossible to read the same sequence twice, in the sense of eq (see
- Equality Predicates), since sequences are always created anew upon reading.
- There is one exception: the empty list () is always read as the same object,
- nil.
-
-
- ΓòÉΓòÉΓòÉ 5.3.4. List Type ΓòÉΓòÉΓòÉ
-
- A list is a series of cons cells, linked together. A cons cell is an object
- comprising two pointers named the car and the cdr. Each of them can point to
- any Lisp object, but when the cons cell is part of a list, the cdr points
- either to another cons cell or to the empty list. See Lists, for functions
- that work on lists.
-
- The names car and cdr have only historical meaning now. The original Lisp
- implementation ran on an IBM 704 computer which divided words into two parts,
- called the ``address'' part and the ``decrement''; car was an instruction to
- extract the contents of the address part of a register, and cdr an instruction
- to extract the contents of the decrement. By contrast, ``cons cells'' are
- named for the function cons that creates them, which in turn is named for its
- purpose, the construction of cells.
-
- Because cons cells are so central to Lisp, we also have a word for ``an object
- which is not a cons cell''. These objects are called atoms.
-
- The read syntax and printed representation for lists are identical, and
- consist of a left parenthesis, an arbitrary number of elements, and a right
- parenthesis.
-
- Upon reading, any object inside the parentheses is made into an element of
- the list. That is, a cons cell is made for each element. The car of the cons
- cell points to the element, and its cdr points to the next cons cell which
- holds the next element in the list. The cdr of the last cons cell is set to
- point to nil.
-
- A list can be illustrated by a diagram in which the cons cells are shown as
- pairs of boxes. (The Lisp reader cannot read such an illustration; unlike the
- textual notation, which can be understood both humans and computers, the box
- illustrations can only be understood by humans.) The following represents the
- three-element list (rose violet buttercup):
-
- ___ ___ ___ ___ ___ ___
- |___|___|--> |___|___|--> |___|___|--> nil
- | | |
- | | |
- --> rose --> violet --> buttercup
-
- In the diagram, each box represents a slot that can refer to any Lisp object.
- Each pair of boxes represents a cons cell. Each arrow is a reference to a Lisp
- object, either an atom or another cons cell.
-
- In this example, the first box, the car of the first cons cell, refers to or
- ``contains'' rose (a symbol). The second box, the cdr of the first cons cell,
- refers to the next pair of boxes, the second cons cell. The car of the second
- cons cell refers to violet and the cdr refers to the third cons cell. The cdr
- of the third (and last) cons cell refers to nil.
-
- Here is another diagram of the same list, (rose violet buttercup), sketched in
- a different manner:
-
- --------------- ---------------- -------------------
- |car |cdr | |car |cdr | |car |cdr |
- | rose | o---------->| violet | o---------->| buttercup | nil |
- | | | | | | | | |
- --------------- ---------------- -------------------
-
- A list with no elements in it is the empty list; it is identical to the symbol
- nil. In other words, nil is both a symbol and a list.
-
- Here are examples of lists written in Lisp syntax:
-
- (A 2 "A") ; A list of three elements.
- () ; A list of no elements (the empty list).
- nil ; A list of no elements (the empty list).
- ("A ()") ; A list of one element: the string "A ()".
- (A ()) ; A list of two elements: A and the empty list.
- (A nil) ; Equivalent to the previous.
- ((A B C)) ; A list of one element
- ; (which is a list of three elements).
-
- Here is the list (A ()), or equivalently (A nil), depicted with boxes and
- arrows:
-
- ___ ___ ___ ___
- |___|___|--> |___|___|--> nil
- | |
- | |
- --> A --> nil
-
-
- ΓòÉΓòÉΓòÉ 5.3.4.1. Dotted Pair Notation ΓòÉΓòÉΓòÉ
-
- Dotted pair notation is an alternative syntax for cons cells that represents
- the car and cdr explicitly. In this syntax, (a . b) stands for a cons cell
- whose car is the object a, and whose cdr is the object b. Dotted pair notation
- is therefore more general than list syntax. In the dotted pair notation, the
- list `(1 2 3)' is written as `(1 . (2 . (3 . nil)))'. For nil-terminated
- lists, the two notations produce the same result, but list notation is usually
- clearer and more convenient when it is applicable. When printing a list, the
- dotted pair notation is only used if the cdr of a cell is not a list.
-
- Box notation can also be used to illustrate what dotted pairs look like. For
- example, (rose . violet) is diagrammed as follows:
-
- ___ ___
- |___|___|--> violet
- |
- |
- --> rose
-
- Dotted pair notation can be combined with list notation to represent a chain
- of cons cells with a non-nil final cdr. For example, (rose violet . buttercup)
- is equivalent to (rose . (violet . buttercup)). The object looks like this:
-
- ___ ___ ___ ___
- |___|___|--> |___|___|--> buttercup
- | |
- | |
- --> rose --> violet
-
- These diagrams make it evident that (rose . violet . buttercup) must have an
- invalid syntax since it would require that a cons cell have three parts rather
- than two.
-
- The list (rose violet) is equivalent to (rose . (violet)) and looks like this:
-
- ___ ___ ___ ___
- |___|___|--> |___|___|--> nil
- | |
- | |
- --> rose --> violet
-
- Similarly, the three-element list (rose violet buttercup) is equivalent to
- (rose . (violet . (buttercup))). It looks like this:
-
- ___ ___ ___ ___ ___ ___
- |___|___|--> |___|___|--> |___|___|--> nil
- | | |
- | | |
- --> rose --> violet --> buttercup
-
-
- ΓòÉΓòÉΓòÉ 5.3.4.2. Association List Type ΓòÉΓòÉΓòÉ
-
- An association list or alist is a specially-constructed list whose elements
- are cons cells. In each element, the car is considered a key, and the cdr is
- considered an associated value. (In some cases, the associated value is stored
- in the car of the cdr.) Association lists are often used to implement stacks,
- since new associations may easily be added to or removed from the front of the
- list.
-
- For example,
-
- (setq alist-of-colors '((rose . red) (lily . white) (buttercup . yellow)))
-
- sets the variable alist-of-colors to an alist of three elements. In the first
- element, rose is the key and red is the value.
-
- See Association Lists, for a further explanation of alists and for functions
- that work on alists.
-
-
- ΓòÉΓòÉΓòÉ 5.3.5. Array Type ΓòÉΓòÉΓòÉ
-
- An array is composed of an arbitrary number of other Lisp objects, arranged in
- a contiguous block of memory. Any element of an array may be accessed in
- constant time. In contrast, accessing an element of a list requires time
- proportional to the position of the element in the list. (Elements at the end
- of a list take longer to access than elements at the beginning of a list.)
-
- Emacs defines two types of array, strings and vectors. A string is an array
- of characters and a vector is an array of arbitrary objects. Both are
- one-dimensional. (Most other programming languages support multidimensional
- arrays, but we don't think they are essential in Emacs Lisp.) Each type of
- array has its own read syntax; see String Type, and Vector Type.
-
- An array may have any length up to the largest integer; but once created, it
- has a fixed size. The first element of an array has index zero, the second
- element has index 1, and so on. This is called zero-origin indexing. For
- example, an array of four elements has indices 0, 1, 2, and 3.
-
- The array type is contained in the sequence type and contains both strings and
- vectors.
-
-
- ΓòÉΓòÉΓòÉ 5.3.6. String Type ΓòÉΓòÉΓòÉ
-
- A string is an array of characters. Strings are used for many purposes in
- Emacs, as can be expected in a text editor; for example, as the names of Lisp
- symbols, as messages for the user, and to represent text extracted from
- buffers. Strings in Lisp are constants; evaluation of a string returns the
- same string.
-
- The read syntax for strings is a double-quote, an arbitrary number of
- characters, and another double-quote, "like this". The Lisp reader accepts the
- same formats for reading the characters of a string as it does for reading
- single characters (without the question mark that begins a character literal).
- You can enter a nonprinting character such as tab, C-a or M-C-A using the
- convenient escape sequences, like this: "\t, \C-a, \M-\C-a". You can include a
- double-quote in a string by preceding it with a backslash; thus, "\"" is a
- string containing just a single double-quote character. (See Character Type,
- for a description of the read syntax for characters.)
-
- In contrast with the C programming language, newlines are allowed in Emacs
- Lisp string literals. But an escaped newline---one that is preceded by
- `\'---does not become part of the string; i.e., the Lisp reader ignores an
- escaped newline in a string literal.
-
- "It is useful to include newlines in
- documentation strings, but the newline is \
- ignored if escaped."
- => "It is useful to include newlines in
- documentation strings, but the newline is ignored if escaped."
-
- The printed representation of a string consists of a double-quote, the
- characters it contains, and another double-quote. However, any backslash or
- double-quote characters in the string are preceded with a backslash like this:
- "this \" is an embedded quote".
-
- See Strings and Characters, for functions that work on strings.
-
-
- ΓòÉΓòÉΓòÉ 5.3.7. Vector Type ΓòÉΓòÉΓòÉ
-
- A vector is a one-dimensional array of elements of any type. It takes a
- constant amount of time to access any element of a vector. (In a list, the
- access time of an element is proportional to the distance of the element from
- the beginning of the list.)
-
- The printed representation of a vector consists of a left square bracket, the
- elements, and a right square bracket. This is also the read syntax. Like
- numbers and strings, vectors are considered constants for evaluation.
-
- [1 "two" (three)] ; A vector of three elements.
- => [1 "two" (three)]
-
- See Vectors, for functions that work with vectors.
-
-
- ΓòÉΓòÉΓòÉ 5.3.8. Symbol Type ΓòÉΓòÉΓòÉ
-
- A symbol in GNU Emacs Lisp is an object with a name. The symbol name is the
- printed representation of the symbol. In ordinary use, the name is unique---no
- two symbols have the same name.
-
- A symbol may be used in programs as a variable, as a function name, or to hold
- a list of properties. Or it may serve only to be distinct from all other Lisp
- objects, so that its presence in a data structure may be recognized reliably.
- In a given context, usually only one of these uses is intended.
-
- A symbol name can contain any characters whatever. Most symbol names are
- written with letters, digits, and the punctuation characters `-+=*/'. Such
- names require no special punctuation; the characters of the name suffice as
- long as the name does not look like a number. (If it does, write a `\' at the
- beginning of the name to force interpretation as a symbol.) The characters
- `_~!@$%^&:<>{}' are less often used but also require no special punctuation.
- Any other characters may be included in a symbol's name by escaping them with a
- backslash. In contrast to its use in strings, however, a backslash in the name
- of a symbol quotes the single character that follows the backslash, without
- conversion. For example, in a string, `\t' represents a tab character; in the
- name of a symbol, however, `\t' merely quotes the letter t. To have a symbol
- with a tab character in its name, you must actually type an tab (preceded with
- a backslash). But you would hardly ever do such a thing.
-
- Common Lisp note: in Common Lisp, lower case letters are always ``folded'' to
- upper case, unless they are explicitly escaped. This is in contrast to Emacs
- Lisp, in which upper case and lower case letters are distinct.
-
- Here are several examples of symbol names. Note that the `+' in the fifth
- example is escaped to prevent it from being read as a number. This is not
- necessary in the last example because the rest of the name makes it invalid as
- a number.
-
- foo ; A symbol named `foo'.
- FOO ; A symbol named `FOO', different from `foo'.
- char-to-string ; A symbol named `char-to-string'.
- 1+ ; A symbol named `1+'
- ; (not `+1', which is an integer).
- \+1 ; A symbol named `+1' (not a very readable name).
- \(*\ 1\ 2\) ; A symbol named `(* 1 2)' (a worse name).
- +-*/_~!@$%^&=:<>{} ; A symbol named `+-*/_~!@$%^&=:<>{}'.
- ; These characters need not be escaped.
-
-
- ΓòÉΓòÉΓòÉ 5.3.9. Lisp Function Type ΓòÉΓòÉΓòÉ
-
- Just as functions in other programming languages are executable, a Lisp
- function object is a piece of executable code. However, Lisp functions are
- primarily Lisp objects, and only secondarily the text which represents them.
- These Lisp objects are lambda expressions: lists whose first element is the
- symbol lambda ( see Lambda Expressions).
-
- In most programming languages, it is impossible to have a function without a
- name. In Lisp, a function has no intrinsic name. A lambda expression is also
- called an anonymous function ( see Anonymous Functions). A named function in
- Lisp is actually a symbol with a valid function in its function cell (see
- Defining Functions).
-
- Most of the time, functions are called when their names are written in Lisp
- expressions in Lisp programs. However, a function object found or constructed
- at run time can be called and passed arguments with the primitive functions
- funcall and apply. See Calling Functions.
-
-
- ΓòÉΓòÉΓòÉ 5.3.10. Lisp Macro Type ΓòÉΓòÉΓòÉ
-
- A Lisp macro is a user-defined construct that extends the Lisp language. It
- is represented as an object much like a function, but with different
- parameter-passing semantics. A Lisp macro has the form of a list whose first
- element is the symbol macro and whose cdr is a Lisp function object, including
- the lambda symbol.
-
- Lisp macro objects are usually defined with the built-in function defmacro,
- but any list that begins with macro is a macro as far as Emacs is concerned.
- See Macros, for an explanation of how to write a macro.
-
-
- ΓòÉΓòÉΓòÉ 5.3.11. Primitive Function Type ΓòÉΓòÉΓòÉ
-
- A primitive function is a function callable from Lisp but written in the C
- programming language. Primitive functions are also called subrs or built-in
- functions. (The word ``subr'' is derived from ``subroutine''.) Most primitive
- functions evaluate all their arguments when they are called. A primitive
- function that does not evaluate all its arguments is called a special form (see
- Special Forms).
-
- It does not matter to the caller of a function whether the function is
- primitive. However, this does matter if you are trying to substitute a
- function written in Lisp for a primitive of the same name. The reason is that
- the primitive function may be called directly from C code. When the redefined
- function is called from Lisp, the new definition will be used; but calls from C
- code may still use the old definition.
-
- The term function is used to refer to all Emacs functions, whether written in
- Lisp or C. See Lisp Function Type, for information about the functions written
- in Lisp.
-
- Primitive functions have no read syntax and print in hash notation with the
- name of the subroutine.
-
- (symbol-function 'car) ; Access the function cell of the symbol.
- => #<subr car>
- (subrp (symbol-function 'car)) ; Is this a primitive function?
- => t ; Yes.
-
-
- ΓòÉΓòÉΓòÉ 5.3.12. Autoload Type ΓòÉΓòÉΓòÉ
-
- An autoload object is a list whose first element is the symbol autoload. It
- is stored as the function definition of a symbol to say that a file of Lisp
- code should be loaded when necessary to find the true definition of that
- symbol. The autoload object contains the name of the file, plus some other
- information about the real definition.
-
- After the file has been loaded, the symbol should have a new function
- definition that is not an autoload object. The new definition is then called
- as if it had been there to begin with. From the user's point of view, the
- function call works as expected, using the function definition in the loaded
- file.
-
- An autoload object is usually created with the function autoload, which stores
- the object in the function cell of a symbol. See Autoload, for more details.
-
-
- ΓòÉΓòÉΓòÉ 5.4. Editing Types ΓòÉΓòÉΓòÉ
-
- The types in the previous section are common to many Lisp-like languages. But
- Emacs Lisp provides several additional data types for purposes connected with
- editing.
-
-
- ΓòÉΓòÉΓòÉ 5.4.1. Buffer Type ΓòÉΓòÉΓòÉ
-
- A buffer is an object that holds text that can be edited (see Buffers). Most
- buffers hold the contents of a disk file (see Files) so they can be edited, but
- some are used for other purposes. Most buffers are also meant to be seen by
- the user, and therefore displayed, at some time, in a window (see Windows).
- But a buffer need not be displayed in a window.
-
- The contents of a buffer are much like a string, but buffers are not used like
- strings in Emacs Lisp, and the available operations are different. For
- example, text can be inserted into a buffer very quickly, while ``inserting''
- text into a string is accomplished by concatenation and the result is an
- entirely new string object.
-
- Each buffer has a designated position called point (see Positions). And one
- buffer is the current buffer. Most editing commands act on the contents of the
- current buffer in the neighborhood of point. Many other functions manipulate
- or test the characters in the current buffer and much of this manual is devoted
- to describing these functions (see Text).
-
- Several other data structures are associated with each buffer:
-
- o a local syntax table (see Syntax Tables);
-
- o a local keymap (see Keymaps); and,
-
- o a local variable binding list (see Variables).
-
- The local keymap and variable list contain entries which individually override
- global bindings or values. These are used to customize the behavior of
- programs in different buffers, without actually changing the programs.
-
- Buffers have no read syntax. They print in hash notation with the buffer
- name.
-
- (current-buffer)
- => #<buffer objects.texi>
-
-
- ΓòÉΓòÉΓòÉ 5.4.2. Window Type ΓòÉΓòÉΓòÉ
-
- A window describes the portion of the terminal screen that Emacs uses to
- display a buffer. Every window has one associated buffer, whose contents
- appear in the window. By contrast, a given buffer may appear in one window, no
- window, or several windows.
-
- Though many windows may exist simultaneously, one window is designated the
- selected window. This is the window where the cursor is (usually) displayed
- when Emacs is ready for a command. The selected window usually displays the
- current buffer, but this is not necessarily the case.
-
- Windows have no read syntax. They print in hash notation, giving the window
- number and the name of the buffer being displayed. The window numbers exist to
- identify windows uniquely, since the buffer displayed in any given window can
- change frequently.
-
- (selected-window)
- => #<window 1 on objects.texi>
-
- See Windows, for a description of the functions that work on windows.
-
-
- ΓòÉΓòÉΓòÉ 5.4.3. Window Configuration Type ΓòÉΓòÉΓòÉ
-
- A window configuration stores information about the positions and sizes of
- windows at the time the window configuration is created, so that the screen
- layout may be recreated later.
-
- Window configurations have no read syntax. They print as
- `#<window-configuration>'. See Window Configurations, for a description of
- several functions related to window configurations.
-
-
- ΓòÉΓòÉΓòÉ 5.4.4. Marker Type ΓòÉΓòÉΓòÉ
-
- A marker denotes a position in a specific buffer. Markers therefore have two
- components: one for the buffer, and one for the position. The position value
- is changed automatically as necessary as text is inserted into or deleted from
- the buffer. This is to ensure that the marker always points between the same
- two characters in the buffer.
-
- Markers have no read syntax. They print in hash notation, giving the current
- character position and the name of the buffer.
-
- (point-marker)
- => #<marker at 10779 in objects.texi>
-
- See Markers, for information on how to test, create, copy, and move markers.
-
-
- ΓòÉΓòÉΓòÉ 5.4.5. Process Type ΓòÉΓòÉΓòÉ
-
- The word process means a running program. Emacs itself runs in a process of
- this sort. However, in Emacs Lisp, a process is a Lisp object that designates
- a subprocess created by Emacs process. External subprocesses, such as shells,
- GDB, ftp, and compilers, may be used to extend the processing capability of
- Emacs.
-
- A process takes input from Emacs and returns output to Emacs for further
- manipulation. Both text and signals can be communicated between Emacs and a
- subprocess.
-
- Processes have no read syntax. They print in hash notation, giving the name
- of the process:
-
- (process-list)
- => (#<process shell>)
-
- See Processes, for information about functions that create, delete, return
- information about, send input or signals to, and receive output from processes.
-
-
- ΓòÉΓòÉΓòÉ 5.4.6. Stream Type ΓòÉΓòÉΓòÉ
-
- A stream is an object that can be used as a source or sink for
- characters---either to supply characters for input or to accept them as output.
- Many different types can be used this way: markers, buffers, strings, and
- functions. Most often, input streams (character sources) obtain characters
- from the keyboard, a buffer, or a file, and output streams (character sinks)
- send characters to a buffer, such as a `*Help*' buffer, or to the echo area.
-
- The object nil, in addition to its other meanings, may be used as a stream.
- It stands for the value of the variable standard-input or standard-output.
- Also, the object t as a stream specifies input using the minibuffer (see
- Minibuffers) or output in the echo area ( see The Echo Area).
-
- Streams have no special printed representation or read syntax, and print as
- whatever primitive type they are.
-
- See Streams, for a description of various functions related to streams,
- including various parsing and printing functions.
-
-
- ΓòÉΓòÉΓòÉ 5.4.7. Keymap Type ΓòÉΓòÉΓòÉ
-
- A keymap maps keys typed by the user to functions. This mapping controls how
- the user's command input is executed. Emacs defines two kinds of keymaps: full
- keymaps, which are vectors of 128 elements, and sparse keymaps, which are
- association lists whose first element is the symbol keymap.
-
- See Keymaps, for information about creating keymaps, handling prefix keys,
- local as well as global keymaps, and changing key bindings.
-
-
- ΓòÉΓòÉΓòÉ 5.4.8. Syntax Table Type ΓòÉΓòÉΓòÉ
-
- A syntax table is a vector of 256 integers. Each element of the vector
- defines how one character is interpreted when it appears in a buffer. For
- example, in C mode (see Major Modes), the `+' character is punctuation, but in
- Lisp mode it is a valid character in a symbol. These different interpretations
- are effected by changing the syntax table entry for `+', i.e., at index 43.
-
- Syntax tables are only used for scanning text in buffers, not for reading Lisp
- expressions. The table the Lisp interpreter uses to read expressions is built
- into the Emacs source code and cannot be changed; thus, to change the list
- delimiters to be `{' and `}' instead of `(' and `)' would be impossible.
-
- See Syntax Tables, for details about syntax classes and how to make and modify
- syntax tables.
-
-
- ΓòÉΓòÉΓòÉ 5.5. Type Predicates ΓòÉΓòÉΓòÉ
-
- The Emacs Lisp interpreter itself does not perform type checking on the actual
- arguments passed to functions when they are called. It could not do otherwise,
- since variables in Lisp are not declared to be of a certain type, as they are
- in other programming languages. It is therefore up to the individual function
- to test whether each actual argument belongs to a type that can be used by the
- function.
-
- All built-in functions do check the types of their actual arguments when
- appropriate and signal a wrong-type-argument error if an argument is of the
- wrong type. For example, here is what happens if you pass an argument to +
- which it cannot handle:
-
- (+ 2 'a)
- error--> Wrong type argument: integer-or-marker-p, a
-
- Many functions, called type predicates, are provided to test whether an object
- is a member of a given type. (Following a convention of long standing, the
- names of most Emacs Lisp predicates end in `p'.)
-
- Here is a table of predefined type predicates, in alphabetical order, with
- references to further information.
-
- atom
- see List-related Predicates
-
- arrayp
- see Array Functions
-
- bufferp
- see Buffer Basics
-
- char-or-string-p
- see Predicates for Strings
-
- consp
- see List-related Predicates
-
- integer-or-marker-p
- see Predicates on Markers
-
- integerp
- see Predicates on Numbers
-
- keymapp
- see Creating Keymaps
-
- listp
- see List-related Predicates
-
- markerp
- see Predicates on Markers
-
- natnump
- see Predicates on Numbers
-
- nlistp
- see List-related Predicates
-
- processp
- see Processes
-
- sequencep
- see Sequence Functions
-
- stringp
- see Predicates for Strings
-
- subrp
- see Function Cells
-
- symbolp
- see Symbols
-
- syntax-table-p
- see Syntax Tables
-
- user-variable-p
- see Defining Variables
-
- vectorp
- see Vectors
-
- windowp
- see Basic Windows
-
-
- ΓòÉΓòÉΓòÉ 5.6. Equality Predicates ΓòÉΓòÉΓòÉ
-
- Here we describe two functions that test for equality between any two objects.
- Other functions test equality between objects of specific types, e.g., strings.
- See the appropriate chapter describing the data type for these predicates.
-
- -- Function: eq object1 object2
- This function returns t if object1 and object2 are the same object, nil
- otherwise. The ``same object'' means that a change in one will be reflected by
- the same change in the other.
-
- eq will be true if object1 and object2 are numbers with the same value. Also,
- since symbol names are normally unique, if the arguments are symbols with the
- same name, they are eq. For other types (e.g., lists, vectors, strings), two
- arguments with the same contents or elements are not necessarily eq to each
- other: they are eq only if they are the same object.
-
- (The make-symbol function returns an uninterned symbol that is not interned in
- the standard obarray. When uninterned symbols are in use, symbol names are no
- longer unique. Distinct symbols with the same name are not eq. See Creating
- Symbols.)
-
- (eq 'foo 'foo)
- => t
-
- (eq 456 456)
- => t
-
- (eq "asdf" "asdf")
- => nil
-
- (eq '(1 (2 (3))) '(1 (2 (3))))
- => nil
-
- (eq [(1 2) 3] [(1 2) 3])
- => nil
-
- (eq (point-marker) (point-marker))
- => nil
-
- -- Function: equal object1 object2
- This function returns t if object1 and object2 have equal components, nil
- otherwise. Whereas eq tests if its arguments are the same object, equal looks
- inside nonidentical arguments to see if their elements are the same. So, if
- two objects are eq, they are equal, but the converse is not always true.
-
- (equal 'foo 'foo)
- => t
-
- (equal 456 456)
- => t
-
- (equal "asdf" "asdf")
- => t
- (eq "asdf" "asdf")
- => nil
-
- (equal '(1 (2 (3))) '(1 (2 (3))))
- => t
- (eq '(1 (2 (3))) '(1 (2 (3))))
- => nil
-
- (equal [(1 2) 3] [(1 2) 3])
- => t
- (eq [(1 2) 3] [(1 2) 3])
- => nil
-
- (equal (point-marker) (point-marker))
- => t
- (eq (point-marker) (point-marker))
- => nil
-
- Comparison of strings is case-sensitive.
-
- (equal "asdf" "ASDF")
- => nil
-
- The test for equality is implemented recursively, and circular lists may
- therefore cause infinite recursion (leading to an error).
-
-
- ΓòÉΓòÉΓòÉ 6. Numbers ΓòÉΓòÉΓòÉ
-
- Integers are the only kind of number in version 18 Emacs Lisp. These are
- whole numbers such as -3, 0, 7, 13, and 511.
-
- In version 19, there is a compile time option to support floating point
- numbers, which are represented internally as the C type double. A floating
- point number is a number with a fractional part, such as -4.5, 0.0, or 2.71828.
- A floating point number can be expressed in an exponential notation as well:
- thus, 1.5e2 equals 150; in this example, `e2' stands for ten to the second
- power, and is multiplied by 1.5.
-
-
- ΓòÉΓòÉΓòÉ 6.1. Number Basics ΓòÉΓòÉΓòÉ
-
- The range of values for an integer depends on the machine. The range is
- -8388608 to 8388607 (24 bits; i.e., -2**23 to 2**23 - 1 ) on most machines, but
- on others it is -16777216 to 16777215 (25 bits), or -33554432 to 33554431 (26
- bits). All of the examples shown below assume an integer has 24 bits.
-
- The Lisp reader reads numbers as a sequence of digits with an optional sign.
-
- 1 ; The integer 1.
- +1 ; Also the integer 1.
- -1 ; The integer -1.
- 16777217 ; Also the integer 1, due to overflow.
- 0 ; The number 0.
- -0 ; The number 0.
- 1. ; Invalid syntax.
-
- To understand how various functions work on integers, especially the bitwise
- operators (see Bitwise Operations), it is often helpful to view the numbers in
- their binary form.
-
- In 24 bit binary, the decimal integer 5 looks like this:
-
- 0000 0000 0000 0000 0000 0101
-
- (We have inserted spaces between groups of 4 bits, and two spaces between
- groups of 8 bits, to make the binary integer easier to read.)
-
- The integer -1 looks like this:
-
- 1111 1111 1111 1111 1111 1111
-
- -1 is represented as 24 ones. (This is called two's complement notation.)
-
- The negative integer, -5, is creating by subtracting 4 from -1. In binary,
- the decimal integer 4 is 100. Consequently, -5 looks like this:
-
- 1111 1111 1111 1111 1111 1011
-
- In this implementation, the largest 24 bit binary integer is the decimal
- integer 8,388,607. In binary, this number looks like this:
-
- 0111 1111 1111 1111 1111 1111
-
- Since the arithmetic functions do not check whether integers go outside their
- range, when you add 1 to 8,388,607, the value is negative integer -8,388,608:
-
- (+ 1 8388607)
- => -8388608
- => 1000 0000 0000 0000 0000 0000
-
- Many of the following functions accept markers for arguments as well as
- integers. (See Markers.) More precisely, the actual parameters to such
- functions may be either integers or markers, which is why we often give these
- parameters the name marker-or-int. When the actual parameter is a marker, the
- position value of the marker is used and the buffer of the marker is ignored.
-
-
- ΓòÉΓòÉΓòÉ 6.2. Type Predicates for Numbers ΓòÉΓòÉΓòÉ
-
- The functions in this section test whether the argument is a number or whether
- it is a certain sort of number. integerp and natnump can take any type of Lisp
- object as argument (the predicates would not be of much use otherwise); but the
- zerop predicate requires an integer as its argument.
-
- -- Function: integerp object
- This predicate tests whether its argument is an integer (a whole number) and
- returns t if so, nil otherwise.
-
- -- Function: natnump object
- The natnump predicate (whose name comes from the phrase ``natural-number-p'')
- tests to see whether its argument is a nonnegative integer, and returns t if
- so, nil otherwise. 0 is considered non-negative.
-
- Markers are not converted to integers, hence natnump of a marker is always nil.
-
- People have pointed out that this function is misnamed, because the term
- ``natural number'' is usually understood as excluding zero. We are open to
- suggestions for a better name to use in version 19.
-
- -- Function: zerop integer
- This predicate tests whether its argument is zero, and returns t if so, nil
- otherwise. These two forms are equivalent: (zerop x) == (= x 0).
-
-
- ΓòÉΓòÉΓòÉ 6.3. Comparison of Numbers ΓòÉΓòÉΓòÉ
-
- The integer type is implemented by storing the value in the ``pointer part''
- of a Lisp object (which, on typical target machines, has 24 bits of pointer, 7
- bits of type and 1 bit for the garbage collector). Because of this, the
- function eq will return t for two integers with the same value. See Equality
- Predicates.
-
- Common Lisp note: because of the way numbers are implemented in Common Lisp,
- you generally need to use `=' to test for equality between numbers. However,
- GNU Emacs Lisp does not need very large integers; as a consequence, it is
- possible to restrict them to the size of a single word, allowing eq to be used.
-
- -- Function: = marker-or-int1 marker-or-int2
- This function tests whether its arguments are the same number, and returns t if
- so, nil otherwise.
-
- -- Function: /= marker-or-int1 marker-or-int2
- This function tests whether its arguments are not the same number, and returns
- t if so, nil otherwise.
-
- -- Function: < marker-or-int1 marker-or-int2
- This function tests whether its first argument is strictly less than its second
- argument. It returns t if so, nil otherwise.
-
- -- Function: <= marker-or-int1 marker-or-int2
- This function tests whether its first argument is less than or equal to its
- second argument. It returns t if so, nil otherwise.
-
- -- Function: > marker-or-int1 marker-or-int2
- This function tests whether its first argument is strictly greater than its
- second argument. It returns t if so, nil otherwise.
-
- -- Function: >= marker-or-int1 marker-or-int2
- This function tests whether its first argument is greater than or equal to its
- second argument. It returns t if so, nil otherwise.
-
- -- Function: max marker-or-int &rest markers-or-ints
- This function returns the largest of its arguments.
-
- (max 20)
- => 20
- (max 1 2)
- => 2
- (max 1 3 2)
- => 3
-
- -- Function: min marker-or-int &rest markers-or-ints
- This function returns the smallest of its arguments.
-
-
- ΓòÉΓòÉΓòÉ 6.4. Arithmetic Operations ΓòÉΓòÉΓòÉ
-
- Emacs Lisp provides the traditional four arithmetic operations: addition,
- subtraction, multiplication, and division. A remainder function supplements
- the (integer) division function. In addition, as a convenience, incrementing
- and decrementing functions are provided.
-
- It is important to note that in GNU Emacs Lisp, arithmetic functions do not
- check for overflow. Thus (1+ 8388607) may equal -8388608, depending on your
- hardware.
-
- -- Function: 1+ marker-or-int
- This function adds one to marker-or-int.
-
- -- Function: 1- marker-or-int
- This function subtracts one from marker-or-int.
-
- -- Function: + &rest markers-or-ints
- This function adds its arguments together. When given no arguments, + returns
- 0. It does not check for overflow.
-
- (+)
- => 0
- (+ 1)
- => 1
- (+ 1 2 3 4)
- => 10
-
- -- Function: - &optional marker-or-int &rest other-markers-or-ints
- The - function serves two purposes: negation and subtraction. When - has a
- single argument, the value is the negative of the argument. When there are
- multiple arguments, each of the other-markers-or-ints is subtracted from
- marker-or-int, cumulatively. If there are no arguments, the result is 0. This
- function does not check for overflow.
-
- (- 10 1 2 3 4)
- => 0
- (- 10)
- => -10
- (-)
- => 0
-
- -- Function: * &rest markers-or-integers
- This function multiplies its arguments together, and returns the product. When
- given no arguments, * returns 1. It does not check for overflow.
-
- (*)
- => 1
- (* 1)
- => 1
- (* 1 2 3 4)
- => 24
-
- -- Function: / dividend divisor &rest divisors
- This function divides dividend by divisors and returns the quotient. If there
- are additional arguments divisors, then dividend is divided by each divisor in
- turn. Each argument may be an integer or a marker.
-
- The result is normally rounded towars zero after each division, but some
- machines may round differently with negative arguments. This is because the
- Lisp function / is implemented using the C division operator, which has the
- same possibility for machine-dependent rounding. In practice, all known
- machines round in the standard fashion.
-
- If you divide by 0, an arith-error error is signaled. (See Errors.)
-
- (/ 6 2)
- => 3
- (/ 5 2)
- => 2
- (/ 25 3 2)
- => 4
- (/ -17 6)
- => -2 ; (Could be -3 on some machines.)
-
- -- Function: % dividend divisor
- This function returns the value of dividend modulo divisor; in other words, the
- integer remainder after division of dividend by divisor. The sign of the
- result is the sign of dividend. The sign of divisor is ignored. The arguments
- must be integers.
-
- For negative arguments, the value is in principle machine-dependent since the
- quotient is; but in practice, all known machines behave alike.
-
- An arith-error results if divisor is 0.
-
- (% 9 4)
- => 1
- (% -9 4)
- => -1
- (% 9 -4)
- => 1
- (% -9 -4)
- => -1
-
- For any two numbers dividend and divisor,
-
- (+ (% dividend divisor)
- (* (/ dividend divisor) divisor))
-
- always equals dividend.
-
-
- ΓòÉΓòÉΓòÉ 6.5. Bitwise Operations on Integers ΓòÉΓòÉΓòÉ
-
- In a computer, an integer is represented as a binary number, a sequence of
- bits (digits which are either zero or one). A bitwise operation acts on the
- individual bits of such a sequence. For example, shifting moves the whole
- sequence left or right one or more places, reproducing the same pattern ``moved
- over''.
-
- The bitwise operations in Emacs Lisp apply only to integers.
-
- -- Function: lsh integer1 count
- lsh, which is an abbreviation for logical shift, shifts the bits in integer1 to
- the left count places, or to the right if count is negative. If count is
- negative, lsh shifts zeros into the most-significant bit, producing a positive
- result even if integer1 is negative. Contrast this with ash, below.
-
- Thus, the decimal number 5 is the binary number 00000101. Shifted once to the
- left, with a zero put in the one's place, the number becomes 00001010, decimal
- 10.
-
- Here are two examples of shifting the pattern of bits one place to the left.
- Since the contents of the rightmost place has been moved one place to the left,
- a value has to be inserted into the rightmost place. With lsh, a zero is placed
- into the rightmost place. (These examples show only the low-order eight bits
- of the binary pattern; the rest are all zero.)
-
- (lsh 5 1)
- => 10
-
- 00000101 => 00001010 ; Decimal 5 becomes decimal 10.
-
- (lsh 7 1)
- => 14
-
- 00000111 => 00001110 ; Decimal 7 becomes decimal 14.
-
- As the examples illustrate, shifting the pattern of bits one place to the left
- produces a number that is twice the value of the previous number.
-
- Note, however that functions do not check for overflow, and a returned value
- may be negative (and in any case, no more than a 24 bit value) when an integer
- is sufficiently left shifted. For example:
-
- (lsh 8388607 1) ; left shift
- => -2
-
- In binary, in the 24 bit implementation,
-
- 0111 1111 1111 1111 1111 1111 ; Decimal 8,388,607
-
- becomes
-
- 1111 1111 1111 1111 1111 1110 ; Decimal -2
-
- Shifting the pattern of bits two places to the left produces results like this
- (with 8-bit binary numbers):
-
- (lsh 3 2)
- => 12
-
- 00000011 => 00001100 ; Decimal 3 becomes decimal 12.
-
- On the other hand, shifting the pattern of bits one place to the right looks
- like this:
-
- (lsh 6 -1)
- => 3
-
- 00000110 => 00000011 ; Decimal 6 becomes decimal 3.
-
- (lsh 5 -1)
- => 2
-
- 00000101 => 00000010 ; Decimal 5 becomes decimal 2.
-
- As the example illustrates, shifting the pattern of bits one place to the right
- divides the value of the binary number by two, rounding downward.
-
- -- Function: ash integer1 count
- ash (arithmetic shift) shifts the bits in integer1 to the left count places, or
- to the right if count is negative.
-
- ash gives the same results as lsh except when integer1 and count are both
- negative. In that case, ash puts a one in the leftmost position, while lsh
- puts a zero in the leftmost position.
-
- Thus, with ash, shifting the pattern of bits one place to the right looks like
- this:
-
- (ash -6 -1)
- => -3 ; Decimal -6 becomes decimal -3.
-
- 1111 1111 1111 1111 1111 1010
- =>
- 1111 1111 1111 1111 1111 1101
-
- In contrast, shifting the pattern of bits one place to the right with lsh looks
- like this:
-
- (lsh -6 -1)
- => 8388605 ; Decimal -6 becomes decimal 8,388,605.
-
- 1111 1111 1111 1111 1111 1010
- =>
- 0111 1111 1111 1111 1111 1101
-
- In this case, the 1 in the leftmost position is shifted one place to the right,
- and a zero is shifted into the leftmost position.
-
- Here are other examples:
-
- ; 24-bit binary values
-
- (lsh 5 2) ; 5 = 0000 0000 0000 0000 0000 0101
- => 20 ; 20 = 0000 0000 0000 0000 0001 0100
- (ash 5 2)
- => 20
- (lsh -5 2) ; -5 = 1111 1111 1111 1111 1111 1011
- => -20 ; -20 = 1111 1111 1111 1111 1110 1100
- (ash -5 2)
- => -20
-
- (lsh 5 -2) ; 5 = 0000 0000 0000 0000 0000 0101
- => 1 ; 1 = 0000 0000 0000 0000 0000 0001
- (ash 5 -2)
- => 1
- (lsh -5 -2) ; -5 = 1111 1111 1111 1111 1111 1011
- => 4194302 ; 0011 1111 1111 1111 1111 1110
- (ash -5 -2) ; -5 = 1111 1111 1111 1111 1111 1011
- => -2 ; -2 = 1111 1111 1111 1111 1111 1110
-
- -- Function: logand &rest markers-or-ints
- This function returns the ``logical and'' of the arguments: the nth bit is set
- in the result if, and only if, the nth bit is set in all the arguments.
- (``Set'' means that the value of the bit is 1 rather than 0.)
-
- For example, using 4-bit binary numbers, the ``logical and'' of 13 and 12 is
- 12: 1101 combined with 1100 produces 1100.
-
- In both the binary numbers, the leftmost two bits are set (i.e., they are 1's),
- so the leftmost two bits of the returned value are set. However, for the
- rightmost two bits, each is zero in at least one of the arguments, so the
- rightmost two bits of the returned value are 0's.
-
- Therefore,
-
- (logand 13 12)
- => 12
-
- If logand is not passed any argument, it returns a value of -1. This number is
- an identity element for logand because its binary representation consists
- entirely of ones. If logand is passed just one argument, it returns that
- argument.
-
- ; 24-bit binary values
-
- (logand 14 13) ; 14 = 0000 0000 0000 0000 0000 1110
- ; 13 = 0000 0000 0000 0000 0000 1101
- => 12 ; 12 = 0000 0000 0000 0000 0000 1100
-
- (logand 14 13 4) ; 14 = 0000 0000 0000 0000 0000 1110
- ; 13 = 0000 0000 0000 0000 0000 1101
- ; 4 = 0000 0000 0000 0000 0000 0100
- => 4 ; 4 = 0000 0000 0000 0000 0000 0100
-
- (logand)
- => -1 ; -1 = 1111 1111 1111 1111 1111 1111
-
- -- Function: logior &rest markers-or-ints
- This function returns the ``inclusive or'' of its arguments: the nth bit is set
- in the result if, and only if, the nth bit is set in at least one of the
- arguments. If there are no arguments, the result is zero, which is an identity
- element for this operation. If logior is passed just one argument, it returns
- that argument.
-
- ; 24-bit binary values
-
- (logior 12 5) ; 12 = 0000 0000 0000 0000 0000 1100
- ; 5 = 0000 0000 0000 0000 0000 0101
- => 13 ; 13 = 0000 0000 0000 0000 0000 1101
-
- (logior 12 5 7) ; 12 = 0000 0000 0000 0000 0000 1100
- ; 5 = 0000 0000 0000 0000 0000 0101
- ; 7 = 0000 0000 0000 0000 0000 0111
- => 15 ; 15 = 0000 0000 0000 0000 0000 1111
-
- -- Function: logxor &rest markers-or-ints
- This function returns the ``exclusive or'' of its arguments: the nth bit is set
- in the result if, and only if, the nth bit is set in an odd number of the
- arguments. If there are no arguments, the result is 0. If logxor is passed
- just one argument, it returns that argument.
-
- ; 24-bit binary values
-
- (logxor 12 5) ; 12 = 0000 0000 0000 0000 0000 1100
- ; 5 = 0000 0000 0000 0000 0000 0101
- => 9 ; 9 = 0000 0000 0000 0000 0000 1001
-
- (logxor 12 5 7) ; 12 = 0000 0000 0000 0000 0000 1100
- ; 5 = 0000 0000 0000 0000 0000 0101
- ; 7 = 0000 0000 0000 0000 0000 0111
- => 14 ; 14 = 0000 0000 0000 0000 0000 1110
-
- -- Function: lognot integer
- This function returns the logical complement of its argument: the nth bit is
- one in the result if, and only if, the nth bit is zero in integer, and
- vice-versa.
-
- (lognot 5) ; 5 = 0000 0000 0000 0000 0000 0101
- => -6 ; -6 = 1111 1111 1111 1111 1111 1010
-
-
- ΓòÉΓòÉΓòÉ 6.6. Random Numbers ΓòÉΓòÉΓòÉ
-
- -- Function: random &optional flag
- This function returns a pseudo-random number of type integer. When called more
- than once, this function returns a series of pseudo-random numbers.
-
- In a computer, a series of a pseudo-random numbers is generated in a
- deterministic fashion. The numbers are not truly random, but they have certain
- properties that mimic a random series. For example, all possible values occur
- equally often in a pseudo-random series.
-
- In Emacs, pseudo-random numbers are generated from a ``seed'' number. If the
- random function starts with the same seed, it generates the same sequence of
- numbers. Emacs always starts with the same seed value, so the sequence of
- values of random is actually the same in each Emacs run! For example, in one
- operating system, the first call to (random) after you start Emacs always
- returns -1457731, and the second one always returns -7692030. This is helpful
- for debugging.
-
- If you want different random numbers, execute (random t). This chooses a new
- seed based on the current time of day and on Emacs' process id number.
-
- On some machines, any integer representable in Lisp may be the result of
- random. On other machines, the result can never be larger than a certain
- maximum or less than a certain (negative) minimum.
-
-
- ΓòÉΓòÉΓòÉ 7. Strings and Characters ΓòÉΓòÉΓòÉ
-
- A string in Emacs Lisp is an array that contains an ordered sequence of
- characters. Strings are used as names of symbols, buffers, and files, to send
- messages to users, to hold text being copied between buffers, and for many
- other purposes. Because strings are so important, many functions are provided
- expressly for manipulating them. Emacs Lisp programs use strings more often
- than individual characters.
-
-
- ΓòÉΓòÉΓòÉ 7.1. Introduction to Strings and Characters ΓòÉΓòÉΓòÉ
-
- Characters are represented in Emacs Lisp as integers; whether an integer was
- intended as a character or not is determined only by how it is used. Strings
- in Emacs Lisp are arrays that contain an ordered sequence of characters.
-
- The length of a string (like any array) is fixed and independent of the string
- contents, and cannot be altered. Strings in Lisp are not terminated by a
- distinguished character code. (By contrast, strings in C are terminated by a
- character with ASCII code 0.) This means that any character, including the null
- character (ASCII code 0), is a valid element of a string.
-
- Since strings are considered arrays, you can operate on them with the general
- array functions. (See Sequences Arrays Vectors.) For example, you can access
- or change individual characters in a string using the functions aref and aset (
- see Array Functions).
-
- Each character in a string is stored in a single byte. Therefore, numbers not
- in the range 0 to 255 are truncated when stored into a string. This means that
- a string takes up much less memory than a vector of the same length.
-
- See Text, for information about functions that display strings or copy them
- into buffers. See Character Type, and String Type, for information about the
- syntax of characters and strings.
-
-
- ΓòÉΓòÉΓòÉ 7.2. The Predicates for Strings ΓòÉΓòÉΓòÉ
-
- For more information about general sequence and array predicates, see Sequences
- Arrays Vectors, and Arrays.
-
- -- Function: stringp object
- This function returns t if object is a string, nil otherwise.
-
- -- Function: char-or-string-p object
- This function returns t if object is a string or a character (i.e., an
- integer), nil otherwise.
-
-
- ΓòÉΓòÉΓòÉ 7.3. Creating Strings ΓòÉΓòÉΓòÉ
-
- The following functions create strings, either from scratch, or by putting
- strings together, or by taking them apart.
-
- -- Function: make-string count character
- This function returns a string made up of count repetitions of character. If
- count is negative, an error is signaled.
-
- (make-string 5 ?x)
- => "xxxxx"
- (make-string 0 ?x)
- => ""
-
- Other functions to compare with this one include char-to-string (see String
- Conversion), make-vector (see Vectors), and make-list (see Building Lists).
-
- -- Function: substring string start &optional end
- This function returns a new string which consists of those characters from
- string in the range from (and including) the character at the index start up to
- (but excluding) the character at the index end. The first character is at
- index zero.
-
- (substring "abcdefg" 0 3)
- => "abc"
-
- Here the index for `a' is 0, the index for `b' is 1, and the index for `c' is
- 2. Thus, three letters, `abc', are copied from the full string. The index 3
- marks the character position up to which the substring is copied. The
- character whose index is 3 is actually the fourth character in the string.
-
- A negative number counts from the end of the string, so that -1 signifies the
- index of the last character of the string. For example:
-
- (substring "abcdefg" -3 -1)
- => "ef"
-
- In this example, the index for `e' is -3, the index for `f' is -2, and the
- index for `g' is -1. Therefore, `e' and `f' are included, and `g' is excluded.
-
- When nil is used as an index, it falls after the last character in the string.
- Thus:
-
- (substring "abcdefg" -3 nil)
- => "efg"
-
- Omitting the argument end is equivalent to specifying nil. It follows that
- (substring string 0) returns a copy of all of string.
-
- (substring "abcdefg" 0)
- => "abcdefg"
-
- But we recommend copy-sequence for this purpose.
-
- A wrong-type-argument error is signaled if either start or end are
- non-integers. An args-out-of-range error is signaled if start indicates a
- character following end, or if either integer is out of range for string.
-
- Contrast this function with buffer-substring ( see Buffer Contents), which
- returns a string containing a portion of the text in the current buffer. The
- beginning of a string is at index 0, but the beginning of a buffer is at index
- 1.
-
- -- Function: concat &rest sequences
- This function returns a new string consisting of the characters in the
- arguments passed to it. The arguments may be strings, lists of numbers, or
- vectors of numbers; they are not themselves changed. If no arguments are
- passed to concat, it returns an empty string.
-
- (concat "abc" "-def")
- => "abc-def"
- (concat "abc" (list 120 (+ 256 121)) [122])
- => "abcxyz"
- (concat "The " "quick brown " "fox.")
- => "The quick brown fox."
- (concat)
- => ""
-
- The second example above shows how characters stored in strings are taken
- modulo 256. In other words, each character in the string is stored in one
- byte.
-
- The concat function always constructs a new string that is not eq to any
- existing string.
-
- When an argument is an integer (not a sequence of integers), it is converted
- to a string of digits making up the decimal printed representation of the
- integer. This special case exists for compatibility with Mocklisp, and we
- don't recommend you take advantage of it. If you want to convert an integer in
- this way, use format (see Formatting Strings) or int-to-string ( see String
- Conversion).
-
- (concat 137)
- => "137"
- (concat 54 321)
- => "54321"
-
- For information about other concatenation functions, see mapconcat in Mapping
- Functions, vconcat in Vectors, and append in Building Lists.
-
-
- ΓòÉΓòÉΓòÉ 7.4. Comparison of Characters and Strings ΓòÉΓòÉΓòÉ
-
- -- Function: char-equal character1 character2
- This function returns t if the arguments represent the same character, nil
- otherwise. This is done by comparing two integers modulo 256.
-
- (char-equal ?x ?x)
- => t
- (char-to-string (+ 256 ?x))
- => "x"
- (char-equal ?x (+ 256 ?x))
- => t
-
- -- Function: string= string1 string2
- This function returns t if the characters of the two strings match exactly;
- case is significant.
-
- (string= "abc" "abc")
- => t
- (string= "abc" "ABC")
- => nil
- (string= "ab" "ABC")
- => nil
-
- -- Function: string-equal string1 string2
- string-equal is another name for string=.
-
- -- Function: string< string1 string2
- This function compares two strings a character at a time. First it scans both
- the strings at once to find the first pair of corresponding characters that do
- not match. If the lesser character of those two is the character from string1,
- then string1 is less, and this function returns t. If the lesser character is
- the one from string2, then string1 is greater, and this function returns nil.
- If the two strings match entirely, the value is nil.
-
- Pairs of characters are compared by their ASCII codes. Keep in mind that
- lower case letters have higher numeric values in the ASCII character set than
- their upper case counterparts; numbers and many punctuation characters have a
- lower numeric value than upper case letters.
-
- (string< "abc" "abd")
- => t
- (string< "abd" "abc")
- => nil
- (string< "123" "abc")
- => t
-
- When the strings have different lengths, and they match up to the length of
- string1, then the result is t. If they match up to the length of string2, the
- result is nil. A string without any characters in it is the smallest possible
- string.
-
- (string< "" "abc")
- => t
- (string< "ab" "abc")
- => t
- (string< "abc" "")
- => nil
- (string< "abc" "ab")
- => nil
- (string< "" "")
- => nil
-
- -- Function: string-lessp string1 string2
- string-lessp is another name for string<.
-
-
- ΓòÉΓòÉΓòÉ 7.5. Conversion of Characters and Strings ΓòÉΓòÉΓòÉ
-
- Characters and strings may be converted into each other and into integers.
- format and prin1-to-string (see Output Functions) may also be used to convert
- Lisp objects into strings. read-from-string (see Input Functions) may be used
- to ``convert'' a string representation of a Lisp object into an object.
-
- See Documentation, for a description of the functions single-key-description
- and text-char-description, which return a string representing the Emacs
- standard notation of the argument character. These functions are used
- primarily for printing help messages.
-
- -- Function: char-to-string character
- This function returns a new string with a length of one character. The value
- of character, modulo 256, is used to initialize the element of the string.
-
- This function is similar to make-string with an integer argument of 1. (See
- Creating Strings.) This conversion can also be done with format using the `%c'
- format specification. (See Formatting Strings.)
-
- (char-to-string ?x)
- => "x"
- (char-to-string (+ 256 ?x))
- => "x"
- (make-string 1 ?x)
- => "x"
-
- -- Function: string-to-char string
- This function returns the first character in string. If the string is empty,
- the function returns 0. The value is also 0 when the first character of string
- is the null character, ASCII code 0.
-
- (string-to-char "ABC")
- => 65
- (string-to-char "xyz")
- => 120
- (string-to-char "")
- => 0
- (string-to-char "\000")
- => 0
-
- This function may be eliminated in version 19 if it does not seem useful enough
- to retain.
-
- -- Function: int-to-string integer
- This function returns a string consisting of the digits of integer, base ten.
- When passed a positive integer as an argument, this function returns an
- unsigned string. When passed a negative integer, the function returns a string
- with a leading minus sign.
-
- (int-to-string 256)
- => "256"
- (int-to-string -23)
- => "-23"
-
- See also the function format in Formatting Strings.
-
- -- Function: string-to-int string
- This function returns the integer value of the characters in string, read as a
- number in base ten.
-
- The string is read starting from (and including) the first character, and it
- is read until a non-digit is encountered. If the first character is not a
- digit or a minus sign, this function returns 0.
-
- (string-to-int "256")
- => 256
- (string-to-int "25 is a perfect square.")
- => 25
- (string-to-int "X256")
- => 0
- (string-to-int "-4")
- => -4
-
-
- ΓòÉΓòÉΓòÉ 7.6. Formatting Strings ΓòÉΓòÉΓòÉ
-
- Formatting means constructing a string by substitution of computed values at
- various places in a constant string. This string controls how the other values
- are printed as well as where they appear; it is called a format string.
-
- Formatting is often useful for computing messages to be displayed. In fact,
- the functions message and error provide the same formatting feature described
- here; they differ from format only in how they use the result of formatting.
-
- -- Function: format string &rest objects
- This function returns a new string that is made by copying string and then
- replacing any format specification in the copy with encodings of the
- corresponding objects. The arguments objects are the computed values to be
- formatted.
-
- A format specification is a sequence of characters beginning with a `%'.
- Thus, if there is a `%d' in string, the format function replaces it with the
- printed representation of one of the values to be formatted (one of the
- arguments objects). For example:
-
- (format "The value of fill-column is %d." fill-column)
- => "The value of fill-column is 72."
-
- If string contains more than one format specification, the format
- specifications are matched in order with successive values from objects. Thus,
- the first format specification in string is matched with the first such value,
- the second format specification is matched with the second such value, and so
- on. Any extra format specifications (those for which there are no
- corresponding values) cause unpredictable behavior. Any extra values to be
- formatted will be ignored.
-
- Certain format specifications require values of particular types. However, no
- error is signaled if the value actually supplied fails to have the expected
- type. Instead, meaningless text is likely to be output.
-
- Here is a table of the characters that can follow `%' to make up a format
- specification:
-
- `s'
- Replace the specification with the printed representation of the
- object. If there is no corresponding object, the empty string is
- used.
-
- `o'
- Replace the specification with the base-eight representation of an
- integer.
-
- `d'
- Replace the specification with the base-ten representation of an
- integer.
-
- `x'
- Replace the specification with the base-sixteen representation of an
- integer.
-
- `c'
- Replace the specification with the character which is the value
- given.
-
- `%'
- A single `%' is placed in the string. This format specification is
- unusual in that it does not use a value. For example, (format "%%
- %d" 30) returns "% 30".
-
- Any other format character results in an `Invalid format operation' error.
-
- Here are several examples:
-
- (format "The name of this buffer is %s." (buffer-name))
- => "The name of this buffer is strings.texi."
-
- (format "The buffer object prints as %s." (current-buffer))
- => "The buffer object prints as #<buffer strings.texi>."
-
- (format "The octal value of 18 is %o, and the hex value is %x."
- 18 18)
- => "The octal value of 18 is 22, and the hex value is 12."
-
- All the specification characters allow an optional numeric prefix between the
- `%' and the character. The optional numeric prefix defines the minimum width
- for the object. If the printed representation of the object contains fewer
- characters than this, then it is padded. The padding is on the left if the
- prefix is positive (or starts with zero) and on the right if the prefix is
- negative. The padding character is normally a space, but if the numeric prefix
- starts with a zero, zeros are used for padding.
-
- (format "%06d will be padded on the left with zeros" 123)
- => "000123 will be padded on the left with zeros"
-
- (format "%-6d will be padded on the right" 123)
- => "123 will be padded on the right"
-
- No matter what the prefix, nothing in the printed representation will be
- truncated. This allows the programmer to specify minimum spacing without
- knowing how many characters there are in the object's printed representation.
-
- In the following three examples, `%7s' specifies a minimum width of 7. In the
- first case, the string inserted in place of `%7s' has only 3 letters, so 4
- blank spaces are inserted for padding. In the second case, the string
- "specification" is 13 letters wide but is not truncated. In the third case,
- the padding is on the right. (This does not work in version 18, but does work
- in version 19.)
-
- (format "The word `%7s' actually has %d letters in it." "foo"
- (length "foo"))
- => "The word ` foo' actually has 3 letters in it."
-
- (format "The word `%7s' actually has %d letters in it."
- "specification"
- (length "specification"))
- => "The word `specification' actually has 13 letters in it."
-
- (format "The word `%-7s' actually has %d letters in it." "foo"
- (length "foo"))
- => "The word `foo ' actually has 3 letters in it."
- ;; `%-7s' fails to work in version 18, but does work in version 19.
- ;; In version 18, padding is not inserted.
-
-
- ΓòÉΓòÉΓòÉ 7.7. Character Case ΓòÉΓòÉΓòÉ
-
- The character case functions change the case of single characters or of the
- contents of strings. The functions convert only alphabetic characters (the
- letters `A' through `Z' and `a' through `z'); other characters are not altered.
- The functions do not modify the strings that are passed to them as arguments.
-
- The examples below use the characters `X' and `x' which have ASCII codes 88
- and 120 respectively.
-
- -- Function: downcase string-or-char
- This function converts a character or a string to lower case.
-
- When the argument to downcase is a string, the function creates and returns a
- new string in which each letter in the argument that is upper case is converted
- to lower case. When the argument to downcase is a character, downcase returns
- the corresponding lower case character. This value is an integer. If the
- original character is lower case, or is not a letter, then the value equals the
- original character.
-
- (downcase "The cat in the hat")
- => "the cat in the hat"
-
- (downcase ?X)
- => 120
-
- -- Function: upcase string-or-char
- This function converts a character or a string to upper case.
-
- When the argument to upcase is a string, the function creates and returns a
- new string in which each letter in the argument that is lower case is converted
- to upper case.
-
- When the argument to upcase is a character, upcase returns the corresponding
- upper case character. This value is an integer. If the original character is
- upper case, or is not a letter, then the value equals the original character.
-
- (upcase "The cat in the hat")
- => "THE CAT IN THE HAT"
-
- (upcase ?x)
- => 88
-
- -- Function: capitalize string-or-char
- This function capitalizes strings or characters. If string-or-char is a
- string, the function creates and returns a new string, whose contents are a
- copy of string-or-char in which each word has been capitalized. This means
- that the first character of each word is converted to upper case, and the rest
- are converted to lower case.
-
- The definition of a word is any sequence of consecutive characters that are
- assigned to the word constituent category in the current syntax table (See
- Syntax Class Table).
-
- When the argument to capitalize is a character, capitalize has the same result
- as upcase.
-
- (capitalize "The cat in the hat")
- => "The Cat In The Hat"
-
- (capitalize "THE 77TH-HATTED CAT")
- => "The 77th-Hatted Cat"
-
- (capitalize ?x)
- => 88
-
-
- ΓòÉΓòÉΓòÉ 8. Lists ΓòÉΓòÉΓòÉ
-
- A list represents a sequence of zero or more elements (which may be any Lisp
- objects). The important difference between lists and vectors is that two or
- more lists can share part of their structure; in addition, you can insert or
- delete elements in a list without copying the whole list.
-
-
- ΓòÉΓòÉΓòÉ 8.1. Lists and Cons Cells ΓòÉΓòÉΓòÉ
-
- Lists in Lisp are not a primitive data type; they are built up from cons
- cells. A cons cell is a data object which represents an ordered pair. It
- records two Lisp objects, one labeled as the car, and the other labeled as the
- cdr. (These names are traditional.)
-
- A list is made by chaining cons cells together, one cons cell per element. By
- convention, the cars of the cons cells are the elements of the list, and the
- cdrs are used to chain the list: the cdr of each cons cell is the following
- cons cell. The cdr of the last cons cell is nil. This asymmetry between the
- car and the cdr is entirely a matter of convention; at the level of cons cells,
- the car and cdr slots have the same characteristics.
-
- The symbol nil is considered a list as well as a symbol; it is the list with
- no elements. Therefore, the cdr of any nonempty list l is a list containing
- all the elements of l except the first. For convenience, the symbol nil is
- considered to have nil as its cdr (and also as its car).
-
-
- ΓòÉΓòÉΓòÉ 8.2. Lists as Linked Pairs of Boxes ΓòÉΓòÉΓòÉ
-
- A cons cell can be illustrated as a pair of boxes. The first box represents
- the car and the second box represents the cdr. Here is an illustration of the
- two-element list, (tulip lily), made from two cons cells:
-
- --------------- ---------------
- |car |cdr | |car |cdr |
- | tulip | o---------->| lily | nil |
- | | | | | |
- --------------- ---------------
-
- Each pair of boxes represents a cons cell. Each box ``refers to'', ``points
- to'' or ``contains'' a Lisp object. (These terms are synonymous.) The first
- box, which is the car of the first cons cell, contains the symbol tulip. The
- arrow from the cdr of the first cons cell to the second cons cell indicates
- that the cdr of the first cons cell points to the second cons cell.
-
- The same list can be illustrated in a different sort of box notation like
- this:
-
- ___ ___ ___ ___
- |___|___|--> |___|___|--> nil
- | |
- | |
- --> tulip --> lily
-
- Here is a more complex illustration, this time of the three-element list,
- ((pine needles) oak maple), the first element of which is a two-element list:
-
- ___ ___ ___ ___ ___ ___
- |___|___|--> |___|___|--> |___|___|--> nil
- | | |
- | | |
- | --> oak --> maple
- |
- | ___ ___ ___ ___
- --> |___|___|--> |___|___|--> nil
- | |
- | |
- --> pine --> needles
-
- The same list is represented in the first box notation like this:
-
- --------------- --------------- ---------------
- |car |cdr | |car |cdr | |car |cdr |
- | o | o---------->| oak | o---------->| maple | nil |
- | | | | | | | | | |
- -- | ---------- --------------- ---------------
- |
- |
- | --------------- -----------------
- | |car |cdr | |car |cdr |
- ------>| pine | o---------->| needles | nil |
- | | | | | |
- --------------- -----------------
-
- See List Type, for the read and print syntax of lists, and for more ``box and
- arrow'' illustrations of lists.
-
-
- ΓòÉΓòÉΓòÉ 8.3. Predicates on Lists ΓòÉΓòÉΓòÉ
-
- The following predicates test whether a Lisp object is an atom, is a cons cell
- or is a list, or whether it is the distinguished object nil. (Many of these
- tests can be defined in terms of the others, but they are used so often that it
- is worth having all of them.)
-
- -- Function: consp object
- This function returns t if object is a cons cell, nil otherwise. nil is not a
- cons cell, although it is a list.
-
- -- Function: atom object
- This function returns t if object is an atom, nil otherwise. All objects
- except cons cells are atoms. The symbol nil is an atom and is also a list; it
- is the only Lisp object which is both.
-
- (atom object) == (not (consp object))
-
- -- Function: listp object
- This function returns t if object is a cons cell or nil. Otherwise, it
- returns nil.
-
- (listp '(1))
- => t
- (listp '())
- => t
-
- -- Function: nlistp object
- This function is the opposite of listp: it returns t if object is not a list.
- Otherwise, it returns nil.
-
- (listp object) == (not (nlistp object))
-
- -- Function: null object
- This function returns t if object is nil, and returns nil otherwise. This
- function is identical to not, but as a matter of clarity we use null when
- object is considered a list and not when it is considered a truth value (see
- not in Combining Conditions).
-
- (null '(1))
- => nil
- (null '())
- => t
-
-
- ΓòÉΓòÉΓòÉ 8.4. Accessing Elements of Lists ΓòÉΓòÉΓòÉ
-
- -- Function: car cons-cell
- This function returns the value pointed to by the first pointer of the cons
- cell cons-cell. Expressed another way, this function returns the car of
- cons-cell.
-
- As a special case, if cons-cell is nil, then car is defined to return nil;
- therefore, any list is a valid argument for car. An error is signaled if the
- argument is not a cons cell or nil.
-
- (car '(a b c))
- => a
- (car '())
- => nil
-
- -- Function: cdr cons-cell
- This function returns the value pointed to by the second pointer of the cons
- cell cons-cell. Expressed another way, this function returns the cdr of
- cons-cell.
-
- As a special case, if cons-cell is nil, then cdr is defined to return nil;
- therefore, any list is a valid argument for cdr. An error is signaled if the
- argument is not a cons cell or nil.
-
- (cdr '(a b c))
- => (b c)
- (cdr '())
- => nil
-
- -- Function: car-safe object
- This function lets you take the car of a cons cell while avoiding errors for
- other data types. It returns the car of object if object is a cons cell, nil
- otherwise. This is in contrast to car, which signals an error if object is not
- a list.
-
- (car-safe object)
- ==
- (let ((x object))
- (if (consp x)
- (car x)
- nil))
-
- -- Function: cdr-safe object
- This function lets you take the cdr of a cons cell while avoiding errors for
- other data types. It returns the cdr of object if object is a cons cell, nil
- otherwise. This is in contrast to cdr, which signals an error if object is not
- a list.
-
- (cdr-safe object)
- ==
- (let ((x object))
- (if (consp x)
- (cdr x)
- nil))
-
- -- Function: nth n list
- This function returns the nth element of list. Elements are numbered starting
- with zero, so the car of list is element number zero. If the length of list is
- n or less, the value is nil.
-
- If n is less than zero, then the first element is returned.
-
- (nth 2 '(1 2 3 4))
- => 3
- (nth 10 '(1 2 3 4))
- => nil
- (nth -3 '(1 2 3 4))
- => 1
-
- (nth n x) == (car (nthcdr n x))
-
- -- Function: nthcdr n list
- This function returns the nth cdr of list. In other words, it removes the
- first n links of list and returns what follows.
-
- If n is less than or equal to zero, then all of list is returned. If the
- length of list is n or less, the value is nil.
-
- (nthcdr 1 '(1 2 3 4))
- => (2 3 4)
- (nthcdr 10 '(1 2 3 4))
- => nil
- (nthcdr -3 '(1 2 3 4))
- => (1 2 3 4)
-
-
- ΓòÉΓòÉΓòÉ 8.5. Building Cons Cells and Lists ΓòÉΓòÉΓòÉ
-
- Many functions build lists, as lists reside at the very heart of Lisp. cons is
- the fundamental list-building function; however, it is interesting to note that
- list is used more times in the source code for Emacs than cons.
-
- -- Function: cons object1 object2
- This function is the fundamental function used to build new list structure.
- It creates a new cons cell, making object1 the car, and object2 the cdr. It
- then returns the new cons cell. The arguments object1 and object2 may be any
- Lisp objects, but most often object2 is a list.
-
- (cons 1 '(2))
- => (1 2)
- (cons 1 '())
- => (1)
- (cons 1 2)
- => (1 . 2)
-
- cons is often used to add a single element to the front of a list. This is
- called consing the element onto the list. For example:
-
- (setq list (cons newelt list))
-
- -- Function: list &rest objects
- This function creates a list with objects as its elements. The resulting list
- is always nil-terminated. If no objects are given, the empty list is returned.
-
- (list 1 2 3 4 5)
- => (1 2 3 4 5)
- (list 1 2 '(3 4 5) 'foo)
- => (1 2 (3 4 5) foo)
- (list)
- => nil
-
- -- Function: make-list length object
- This function creates a list of length length, in which all the elements have
- the identical value object. Compare make-list with make-string (see Creating
- Strings).
-
- (make-list 3 'pigs)
- => (pigs pigs pigs)
- (make-list 0 'pigs)
- => nil
-
- -- Function: append &rest sequences
- This function returns a list containing all the elements of sequences. The
- sequences may be lists, vectors, strings, or integers. All arguments except
- the last one are copied, so none of them are altered.
-
- The final argument to append may be any object but it is typically a list.
- The final argument is not copied or converted; it becomes part of the structure
- of the new list.
-
- Here is an example:
-
- (setq trees '(pine oak))
- => (pine oak)
- (setq more-trees (append '(maple birch) trees))
- => (maple birch pine oak)
-
- trees
- => (pine oak)
- more-trees
- => (maple birch pine oak)
- (eq trees (cdr (cdr more-trees)))
- => t
-
- You can see what happens by looking at a box diagram. The variable trees is
- set to the list (pine oak) and then the variable more-trees is set to the list
- (maple birch pine oak). However, the variable trees continues to refer to the
- original list:
-
- more-trees trees
- | |
- | ___ ___ ___ ___ -> ___ ___ ___ ___
- --> |___|___|--> |___|___|--> |___|___|--> |___|___|--> nil
- | | | |
- | | | |
- --> maple -->birch --> pine --> oak
-
- An empty sequence contributes nothing to the value returned by append. As a
- consequence of this, a final nil argument forces a copy of the previous
- argument.
-
- trees
- => (pine oak)
- (setq wood (append trees ()))
- => (pine oak)
- wood
- => (pine oak)
- (eq wood trees)
- => nil
-
- This once was the standard way to copy a list, before the function
- copy-sequence was invented. See Sequences Arrays Vectors.
-
- With the help of apply, we can append all the lists in a list of lists:
-
- (apply 'append '((a b c) nil (x y z) nil))
- => (a b c x y z)
-
- If no sequences are given, nil is returned:
-
- (append)
- => nil
-
- In the special case where one of the sequences is an integer (not a sequence of
- integers), it is first converted to a string of digits making up the decimal
- print representation of the integer. This special case exists for
- compatibility with Mocklisp, and we don't recommend you take advantage of it.
- If you want to convert an integer in this way, use format (see Formatting
- Strings) or int-to-string (see String Conversion).
-
- (setq trees '(pine oak))
- => (pine oak)
- (char-to-string ?\054)
- => "6"
- (setq longer-list (append trees 6 '(spruce)))
- => (pine oak 54 spruce)
- (setq x-list (append trees 6 6))
- => (pine oak 54 . 6)
-
- See nconc in Rearrangement, for another way to join lists without copying.
-
- -- Function: reverse list
- This function creates a new list whose elements are the elements of list, but
- in reverse order. The original argument list is not altered.
-
- (setq x '(1 2 3 4))
- => (1 2 3 4)
- (reverse x)
- => (4 3 2 1)
- x
- => (1 2 3 4)
-
-
- ΓòÉΓòÉΓòÉ 8.6. Modifying Existing List Structure ΓòÉΓòÉΓòÉ
-
- You can modify the car and cdr contents of a cons cell with the primitives
- setcar and setcdr.
-
- Common Lisp note: Common Lisp uses functions rplaca and rplacd to alter list
- structure; they change structure the same way as setcar and setcdr, but the
- Common Lisp functions return the cons cell while setcar and setcdr return the
- new car or cdr.
-
-
- ΓòÉΓòÉΓòÉ 8.6.1. Altering List Elements with setcar ΓòÉΓòÉΓòÉ
-
- Changing the car of a cons cell is done with setcar and replaces one element
- of a list with a different element.
-
- -- Function: setcar cons object
- This function stores object as the new car of cons, replacing its previous
- car. It returns the value object. For example:
-
- (setq x '(1 2))
- => (1 2)
- (setcar x '4)
- => 4
- x
- => (4 2)
-
- When a cons cell is part of the shared structure of several lists, storing a
- new car into the cons changes one element of each of these lists. Here is an
- example:
-
- ;; Create two lists that are partly shared.
- (setq x1 '(a b c))
- => (a b c)
- (setq x2 (cons 'z (cdr x1)))
- => (z b c)
-
- ;; Replace the car of a shared link.
- (setcar (cdr x1) 'foo)
- => foo
- x1 ; Both lists are changed.
- => (a foo c)
- x2
- => (z foo c)
-
- ;; Replace the car of a link that is not shared.
- (setcar x1 'baz)
- => baz
- x1 ; Only one list is changed.
- => (baz foo c)
- x2
- => (z foo c)
-
- Here is a graphical depiction of the shared structure of the two lists x1 and
- x2, showing why replacing b changes them both:
-
- ___ ___ ___ ___ ___ ___
- x1---> |___|___|----> |___|___|--> |___|___|--> nil
- | --> | |
- | | | |
- --> a | --> b --> c
- |
- ___ ___ |
- x2--> |___|___|--
- |
- |
- --> z
-
- Here is an alternative form of box diagram, showing the same relationship:
-
- x1:
- --------------- --------------- ---------------
- |car |cdr | |car |cdr | |car |cdr |
- | a | o---------->| b | o---------->| c | nil |
- | | | -->| | | | | |
- --------------- | --------------- ---------------
- |
- x2: |
- --------------- |
- |car |cdr | |
- | z | o-------
- | | |
- ---------------
-
-
- ΓòÉΓòÉΓòÉ 8.6.2. Altering the CDR of a List ΓòÉΓòÉΓòÉ
-
- The lowest-level primitive for modifying a cdr is setcdr:
-
- -- Function: setcdr cons object
- This function stores object into the cdr of cons. The value returned is
- object, not cons.
-
- Here is an example of replacing the cdr of a list with a different list. All
- but the first element of the list are removed in favor of a different sequence
- of elements. The first element is unchanged, because it resides in the car of
- the list, and is not reached via the cdr.
-
- (setq x '(1 2 3))
- => (1 2 3)
- (setcdr x '(4))
- => (4)
- x
- => (1 4)
-
- You can delete elements from the middle of a list by altering the cdrs of the
- cons cells in the list. For example, here we delete the second element, b,
- from the list (a b c), by changing the cdr of the first cell:
-
- (setq x1 '(a b c))
- => (a b c)
- (setcdr x1 '(c))
- => (c)
- x1
- => (a c)
-
- Here is the result in box notation:
-
- -----------------------
- | |
- --------------- | --------------- | ---------------
- |car |cdr | | |car |cdr | -->|car |cdr |
- | a | o------- | b | o---------->| c | nil |
- | | | | | | | | |
- --------------- --------------- ---------------
-
- The second cons cell, which previously held the element b, still exists and its
- car is still b, but it no longer forms part of this list.
-
- It is equally easy to insert a new element by changing cdrs:
-
- (setq x1 '(a b c))
- => (a b c)
- (setcdr x1 (cons 'd (cdr x1)))
- => (d b c)
- x1
- => (a d b c)
-
- Here is this result in box notation:
-
- --------------- --------------- ---------------
- |car |cdr | |car |cdr | |car |cdr |
- | a | o | -->| b | o---------->| c | nil |
- | | | | | | | | | | |
- ---------- | -- | --------------- ---------------
- | |
- ------ -------
- | |
- | --------------- |
- | |car |cdr | |
- -->| d | o------
- | | |
- ---------------
-
-
- ΓòÉΓòÉΓòÉ 8.6.3. Functions that Rearrange Lists ΓòÉΓòÉΓòÉ
-
- Here are some functions that rearrange lists ``destructively'' by modifying
- the cdrs of their component cons cells. We call these functions
- ``destructive'' because the original lists passed as arguments to them are
- chewed up to produce a new list that is subsequently returned.
-
- -- Function: nconc &rest lists
- This function returns a list containing all the elements of lists. Unlike
- append (see Building Lists), the lists are not copied. Instead, the last cdr
- of each of the lists is changed to refer to the following list. The last of
- the lists is not altered. For example:
-
- (setq x '(1 2 3))
- => (1 2 3)
- (nconc x '(4 5))
- => (1 2 3 4 5)
- x
- => (1 2 3 4 5)
-
- Since the last argument of nconc is not itself modified, it is reasonable to
- use a constant list, such as '(4 5), as is done in the above example. For the
- same reason, the last argument need not be a list:
-
- (setq x '(1 2 3))
- => (1 2 3)
- (nconc x 'z)
- => (1 2 3 . z)
- x
- => (1 2 3 . z)
-
- A common pitfall is to use a quoted constant list as a non-last argument to
- nconc. If you do this, your program will change each time you run it! Here is
- what happens:
-
- (defun add-foo (x) ; This function should add
- (nconc '(foo) x)) ; foo to the front of its arg.
-
- (symbol-function 'add-foo)
- => (lambda (x) (nconc (quote (foo)) x))
-
- (setq xx (add-foo '(1 2))) ; It seems to work.
- => (foo 1 2)
- (setq xy (add-foo '(3 4))) ; What happened?
- => (foo 1 2 3 4)
- (eq xx xy)
- => t
-
- (symbol-function 'add-foo)
- => (lambda (x) (nconc (quote (foo 1 2 3 4) x)))
-
- -- Function: nreverse list
- This function reverses the order of the elements of list. Unlike reverse,
- nreverse alters its argument destructively by reversing the cdrs in the cons
- cells forming the list. The cons cell which used to be the last one in list
- becomes the first cell of the value.
-
- For example:
-
- (setq x '(1 2 3 4))
- => (1 2 3 4)
- x
- => (1 2 3 4)
- (nreverse x)
- => (4 3 2 1)
- ;; The cell that was first is now last.
- x
- => (1)
-
- To avoid confusion, we usually store the result of nreverse back in the same
- variable which held the original list:
-
- (setq x (nreverse x))
-
- Here is the nreverse of our favorite example, (a b c), presented graphically:
-
- Original list head: Reversed list:
- --------------- --------------- ---------------
- |car |cdr | |car |cdr | |car |cdr |
- | a | nil |<-- | b | o |<-- | c | o |
- | | | | | | | | | | | | |
- --------------- | ---------- | -- | ---------- | --
- | | | |
- --------------- ---------------
-
- -- Function: sort list predicate
- This function sorts list stably, though destructively, and returns the sorted
- list. It compares elements using predicate. A stable sort is one in which
- elements with equal sort keys maintain their relative order before and after
- the sort. Stability is important when successive sorts are used to order
- elements according to different criteria.
-
- The argument predicate must be a function that accepts two arguments. It is
- called with two elements of list. To get an increasing order sort, the
- predicate should return t if the first element is ``less than'' the second, or
- nil if not.
-
- The destructive aspect of sort is that it rearranges the cons cells forming
- list by changing cdrs. A nondestructive sort function would create new cons
- cells to store the elements in their sorted order. If you wish to sort a list
- without destroying the original, copy it first with copy-sequence.
-
- The cars of the cons cells are not changed; the cons cell that originally
- contained the element a in list still has a in its car after sorting, but it
- now appears in a different position in the list due to the change of cdrs. For
- example:
-
- (setq nums '(1 3 2 6 5 4 0))
- => (1 3 2 6 5 4 0)
- (sort nums '<)
- => (0 1 2 3 4 5 6)
- nums
- => (1 2 3 4 5 6)
-
- Note that the list in nums no longer contains 0; this is the same cons cell
- that it was before, but it is no longer the first one in the list. Don't
- assume a variable that formerly held the argument now holds the entire sorted
- list! Instead, save the result of sort and use that. Most often we store the
- result back into the variable that held the original list:
-
- (setq nums (sort nums '<))
-
- See Sorting, for more functions that perform sorting. See documentation in
- Accessing Documentation, for a useful example of sort.
-
- See delq, in Sets And Lists, for another function that modifies cons cells.
-
-
- ΓòÉΓòÉΓòÉ 8.7. Using Lists as Sets ΓòÉΓòÉΓòÉ
-
- A list can represent an unordered mathematical set---simply consider a value
- an element of a set if it appears in the list, and ignore the order of the
- list. To form the union of two sets, use append (as long as you don't mind
- having duplicate elements). Two other useful functions for sets are memq and
- delq.
-
- Common Lisp note: Common Lisp has functions union (which avoids duplicate
- elements) and intersection for set operations, but GNU Emacs Lisp does not have
- them. You can write them in Lisp if you wish.
-
- -- Function: memq object list
- This function tests to see whether object is a member of list. If it is, memq
- returns a list starting with the first occurrence of object. Otherwise, it
- returns nil. The letter `q' in memq says that it uses eq to compare object
- against the elements of the list. For example:
-
- (memq 2 '(1 2 3 2 1))
- => (2 3 2 1)
- (memq '(2) '((1) (2))) ; (2) and (2) are not eq.
- => nil
-
- -- Function: delq object list
- This function removes all elements eq to object from list.
-
- Elements at the front of the list are removed (when necessary) simply by
- advancing down the list and returning a sublist that starts after those
- elements:
-
- (delq 'a '(a b c))
- ==
- (cdr '(a b c))
-
- When an element to be deleted appears in the middle of the list, removing it
- involves changing the cdrs (see Setcdr).
-
- (setq sample-list '(1 2 3 (4)))
- => (1 2 3 (4))
- (delq 1 sample-list)
- => (2 3 (4))
- sample-list
- => (1 2 3 (4))
- (delq 2 sample-list)
- => (1 3 (4))
- sample-list
- => (1 3 (4))
-
- Note that (delq 2 sample-list) removes the second element of sample-list, but
- (delq 1 sample-list) does not remove the first element---it just returns a
- shorter list. Don't assume that a variable which formerly held the argument
- list now has fewer elements, or that it still holds the original list!
- Instead, save the result of delq and use that. Most often we store the result
- back into the variable that held the original list:
-
- (setq flowers (delq 'rose flowers))
-
- In the following example, the (4) that delq attempts to match and the (4) in
- the sample-list are not eq:
-
- (delq '(4) sample-list)
- => (1 3 (4))
-
-
- ΓòÉΓòÉΓòÉ 8.8. Association Lists ΓòÉΓòÉΓòÉ
-
- An association list, or alist for short, records a mapping from keys to
- values. It is a list of cons cells called associations: the car of each cell
- is the key, and the cdr is the associated value. (This usage of ``key'' is not
- related to the term ``key sequence''; it means any object which can be looked
- up in a table.)
-
- Here is an example of an alist. The key pine is associated with the value
- cones; the key oak is associated with acorns; and the key maple is associated
- with seeds.
-
- '((pine . cones)
- (oak . acorns)
- (maple . seeds))
-
- The associated values in an alist may be any Lisp objects; so may the keys.
- For example, in the following alist, the symbol a is associated with the number
- 1, and the string "b" is associated with the list (2 3), which is the cdr of
- the alist element:
-
- ((a . 1) ("b" 2 3))
-
- Sometimes it is better to design an alist to store the associated value in the
- car of the cdr of the element. Here is an example:
-
- '((rose red) (lily white) (buttercup yellow)))
-
- Here we regard red as the value associated with rose. One advantage of this
- method is that you can store other related information---even a list of other
- items---in the cdr of the cdr. One disadvantage is that you cannot use rassq
- (see below) to find the element containing a given value. When neither of
- these considerations is important, the choice is a matter of taste, as long as
- you are consistent about it for any given alist.
-
- Note that the same alist shown above could be regarded as having the
- associated value in the cdr of the element; the the value associated with rose
- would be the list (red).
-
- Association lists are often used to record information that you might
- otherwise keep on a stack, since new associations may be added easily to the
- front of the list. When searching an association list for an association with
- a given key, the first one found is returned, if there is more than one.
-
- In Emacs Lisp, it is not an error if an element of an association list is not
- a cons cell. The alist search functions simply ignore such elements. Many
- other versions of Lisp signal errors in such cases.
-
- Note that property lists are similar to association lists in several respects.
- A property list behaves like an association list in which each key can occur
- only once. See Property Lists, for a comparison of property lists and
- association lists.
-
- -- Function: assoc key alist
- This function returns the first association for key in alist. It compares key
- against the alist elements using equal (see Equality Predicates). It returns
- nil if no association in alist has a car equal to key. For example:
-
- (setq trees '((pine . cones) (oak . acorns) (maple . seeds)))
- => ((pine . cones) (oak . acorns) (maple . seeds))
- (assoc 'oak trees)
- => (oak . acorns)
- (cdr (assoc 'oak trees))
- => acorns
- (assoc 'birch trees)
- => nil
-
- Here is another example in which the keys and values are not symbols:
-
- (setq needles-per-cluster
- '((2 . ("Austrian Pine" "Red Pine"))
- (3 . "Pitch Pine")
- (5 . "White Pine")))
-
- (cdr (assoc 3 needles-per-cluster))
- => "Pitch Pine"
- (cdr (assoc 2 needles-per-cluster))
- => ("Austrian Pine" "Red Pine")
-
- -- Function: assq key alist
- This function is like assoc in that it returns the first association for key
- in alist, but it makes the comparison using eq instead of equal. assq returns
- nil if no association in alist has a car eq to key. This function is used more
- often than assoc, since eq is faster than equal and most alists use symbols as
- keys. See Equality Predicates.
-
- (setq trees '((pine . cones) (oak . acorns) (maple . seeds)))
-
- (assq 'pine trees)
- => (pine . cones)
-
- On the other hand, assq is not usually useful in alists where the keys may not
- be symbols:
-
- (setq leaves
- '(("simple leaves" . oak)
- ("compound leaves" . horsechestnut)))
-
- (assq "simple leaves" leaves)
- => nil
- (assoc "simple leaves" leaves)
- => ("simple leaves" . oak)
-
- -- Function: rassq alist value
- This function returns the first association with value value in alist. It
- returns nil if no association in alist has a cdr eq to value.
-
- rassq is like assq except that the cdr of the alist associations is tested
- instead of the car. You can think of this as ``reverse assq'', finding the key
- for a given value.
-
- For example:
-
- (setq trees '((pine . cones) (oak . acorns) (maple . seeds)))
-
- (rassq 'acorns trees)
- => (oak . acorns)
- (rassq 'spores trees)
- => nil
-
- Note that rassq cannot be used to search for a value stored in the car of the
- cdr of an element:
-
- (setq colors '((rose red) (lily white) (buttercup yellow)))
-
- (rassq 'white colors)
- => nil
-
- In this case, the cdr of the association (lily white) is not the symbol white,
- but rather the list (white). This can be seen more clearly if the association
- is written in dotted pair notation:
-
- (lily white) == (lily . (white))
-
- -- Function: copy-alist alist
- This function returns a two-level deep copy of alist: it creates a new copy of
- each association, so that you can alter the associations of the new alist
- without changing the old one.
-
- (setq needles-per-cluster
- '((2 . ("Austrian Pine" "Red Pine"))
- (3 . "Pitch Pine")
- (5 . "White Pine")))
- =>
- ((2 "Austrian Pine" "Red Pine")
- (3 . "Pitch Pine")
- (5 . "White Pine"))
-
- (setq copy (copy-alist needles-per-cluster))
- =>
- ((2 "Austrian Pine" "Red Pine")
- (3 . "Pitch Pine")
- (5 . "White Pine"))
-
- (eq needles-per-cluster copy)
- => nil
- (equal needles-per-cluster copy)
- => t
- (eq (car needles-per-cluster) (car copy))
- => nil
- (cdr (car (cdr needles-per-cluster)))
- => "Pitch Pine"
- (eq (cdr (car (cdr needles-per-cluster)))
- (cdr (car (cdr copy))))
- => t
-
-
- ΓòÉΓòÉΓòÉ 9. Sequences, Arrays, and Vectors ΓòÉΓòÉΓòÉ
-
- Recall that the sequence type is the union of three other Lisp types: lists,
- vectors, and strings. In other words, any list is a sequence, any vector is a
- sequence, and any string is a sequence. The common property that all sequences
- have is that each is an ordered collection of elements.
-
- An array is a single primitive object directly containing all its elements.
- Therefore, all the elements are accessible in constant time. The length of an
- existing array cannot be changed. Both strings and vectors are arrays. A list
- is a sequence of elements, but it is not a single primitive object; it is made
- of cons cells, one cell per element. Therefore, elements farther from the
- beginning of the list take longer to access, but it is possible to add elements
- to the list or remove elements. The elements of vectors and lists may be any
- Lisp objects. The elements of strings are all characters.
-
- The following diagram shows the relationship between these types:
-
- ___________________________________
- | |
- | Sequence |
- | ______ ______________________ |
- | | | | | |
- | | List | | Array | |
- | | | | ________ _______ | |
- | |______| | | | | | | |
- | | | String | | Vector| | |
- | | |________| |_______| | |
- | |______________________| |
- |___________________________________|
-
- The Relationship between Sequences , Arrays , and Vectors
-
-
- ΓòÉΓòÉΓòÉ 9.1. Sequences ΓòÉΓòÉΓòÉ
-
- In Emacs Lisp, a sequence is either a list, a vector or a string. The common
- property that all sequences have is that each is an ordered collection of
- elements. This section describes functions that accept any kind of sequence.
-
- -- Function: sequencep object
- Returns t if object is a list, vector, or string, nil otherwise.
-
- -- Function: copy-sequence sequence
- Returns a copy of sequence. The copy is the same type of object as the
- original sequence, and it has the same elements in the same order.
-
- Storing a new element into the copy does not affect the original sequence, and
- vice versa. However, the elements of the new sequence are not copies; they are
- identical (eq) to the elements of the original. Therefore, changes made within
- these elements, as found via the copied sequence, are also visible in the
- original sequence.
-
- See also append in Building Lists, concat in Creating Strings, and vconcat in
- Vectors, for others ways to copy sequences.
-
- (setq bar '(1 2))
- => (1 2)
- (setq x (vector 'foo bar))
- => [foo (1 2)]
- (setq y (copy-sequence x))
- => [foo (1 2)]
-
- (eq x y)
- => nil
- (equal x y)
- => t
- (eq (elt x 1) (elt y 1))
- => t
-
- ;; Replacing an element of one sequence.
- (aset x 0 'quux)
- x => [quux (1 2)]
- y => [foo (1 2)]
-
- ;; Modifying the inside of a shared element.
- (setcar (aref x 1) 69)
- x => [quux (69 2)]
- y => [foo (69 2)]
-
- -- Function: length sequence
- Returns the number of elements in sequence. If sequence is a cons cell that is
- not a list (because the final cdr is not nil), a wrong-type-argument error is
- signaled.
-
- (length '(1 2 3))
- => 3
- (length nil)
- => 0
- (length "foobar")
- => 6
- (length [1 2 3])
- => 3
-
- -- Function: elt sequence index
- This function returns the element of sequence indexed by index. Legitimate
- values of index are integers ranging from 0 up to one less than the length of
- sequence; other values produce an args-out-of-range error.
-
- (elt [1 2 3 4] 2)
- => 3
- (elt '(1 2 3 4) 2)
- => 3
- (char-to-string (elt "1234" 2))
- => "3"
- (elt [1 2 3 4] 4)
- error-->Args out of range: [1 2 3 4], 4
- (elt [1 2 3 4] -1)
- error-->Args out of range: [1 2 3 4], -1
-
- This function duplicates aref (see Array Functions) and nth (see List
- Elements), except that it works for any kind of sequence.
-
-
- ΓòÉΓòÉΓòÉ 9.2. Arrays ΓòÉΓòÉΓòÉ
-
- An array object refers directly to a number of other Lisp objects, called the
- elements of the array. Any element of an array may be accessed in constant
- time. In contrast, an element of a list requires access time that is
- proportional to the position of the element in the list.
-
- When you create an array, you must specify how many elements it has. The
- amount of space allocated depends on the number of elements. Therefore, it is
- impossible to change the size of an array once it is created. You cannot add
- or remove elements. However, you can replace an element with a different
- value.
-
- Emacs defines two types of array, both of which are one-dimensional: strings
- and vectors. A vector is a general array; its elements can be any Lisp
- objects. A string is a specialized array; its elements must be characters
- (i.e., integers between 0 and 255). Each type of array has its own read
- syntax. See String Type, and Vector Type.
-
- Both kinds of arrays share these characteristics:
-
- o The first element of an array has index zero, the second element has index 1,
- and so on. This is called zero-origin indexing. For example, an array of
- four elements has indices 0, 1, 2, and 3.
-
- o The elements of an array may be referenced or changed with the functions aref
- and aset, respectively (see Array Functions).
-
- In principle, if you wish to have an array of characters, you could use either
- a string or a vector. In practice, we always choose strings for such
- applications, for three reasons:
-
- o They occupy one-fourth the space of a vector of the same elements.
-
- o Strings are printed in a way that shows the contents more clearly as
- characters.
-
- o Many of the specialized editing and I/O facilities of Emacs accept only
- strings. For example, you cannot insert a vector of characters into a buffer
- the way you can insert a string. See Strings and Characters.
-
-
- ΓòÉΓòÉΓòÉ 9.3. Functions that Operate on Arrays ΓòÉΓòÉΓòÉ
-
- In this section, we describe the functions that accept both strings and
- vectors.
-
- -- Function: arrayp object
- This function returns t if object is an array (i.e., either a vector or a
- string).
-
- (arrayp [a])
- => t
- (arrayp "asdf")
- => t
-
- -- Function: aref array index
- This function returns the indexth element of array. The first element is at
- index zero.
-
- (setq primes [2 3 5 7 11 13])
- => [2 3 5 7 11 13]
- (aref primes 4)
- => 11
- (elt primes 4)
- => 11
-
- (aref "abcdefg" 1)
- => 98 ; `b' is ASCII code 98.
-
- See also the function elt, in Sequence Functions.
-
- -- Function: aset array index object
- This function sets the indexth element of array to be object. It returns
- object.
-
- (setq w [foo bar baz])
- => [foo bar baz]
- (aset w 0 'fu)
- => fu
- w
- => [fu bar baz]
-
- (setq x "asdfasfd")
- => "asdfasfd"
- (aset x 3 ?Z)
- => 90
- x
- => "asdZasfd"
-
- If array is a string and object is not a character, a wrong-type-argument error
- results.
-
- -- Function: fillarray array object
- This function fills the array array with pointers to object, replacing any
- previous values. It returns array.
-
- (setq a [a b c d e f g])
- => [a b c d e f g]
- (fillarray a 0)
- => [0 0 0 0 0 0 0]
- a
- => [0 0 0 0 0 0 0]
- (setq s "When in the course")
- => "When in the course"
- (fillarray s ?-)
- => "------------------"
-
- If array is a string and object is not a character, a wrong-type-argument error
- results.
-
- The general sequence functions copy-sequence and length are often useful for
- objects known to be arrays. See Sequence Functions.
-
-
- ΓòÉΓòÉΓòÉ 9.4. Vectors ΓòÉΓòÉΓòÉ
-
- Arrays in Lisp, like arrays in most languages, are blocks of memory whose
- elements can be accessed in constant time. A vector is a general-purpose
- array; its elements can be any Lisp objects. (The other kind of array provided
- in Emacs Lisp is the string, whose elements must be characters.) The main uses
- of vectors in Emacs are as syntax tables (vectors of integers) and keymaps
- (vectors of commands). They are also used internally as part of the
- representation of a byte-compiled function; if you print such a function, you
- will see a vector in it.
-
- The indices of the elements of a vector are numbered starting with zero in
- Emacs Lisp.
-
- Vectors are printed with square brackets surrounding the elements in their
- order. Thus, a vector containing the symbols a, b and c is printed as [a b c].
- You can write vectors in the same way in Lisp input.
-
- A vector, like a string or a number, is considered a constant for evaluation:
- the result of evaluating it is the same vector. The elements of the vector are
- not evaluated. See Self-Evaluating Forms.
-
- Here are examples of these principles:
-
- (setq avector [1 two '(three) "four" [five]])
- => [1 two (quote (three)) "four" [five]]
- (eval avector)
- => [1 two (quote (three)) "four" [five]]
- (eq avector (eval avector))
- => t
-
- Here are some functions that relate to vectors:
-
- -- Function: vectorp object
- This function returns t if object is a vector.
-
- (vectorp [a])
- => t
- (vectorp "asdf")
- => nil
-
- -- Function: vector &rest objects
- This function creates and returns a vector whose elements are the arguments,
- objects.
-
- (vector 'foo 23 [bar baz] "rats")
- => [foo 23 [bar baz] "rats"]
- (vector)
- => []
-
- -- Function: make-vector integer object
- This function returns a new vector consisting of integer elements, each
- initialized to object.
-
- (setq sleepy (make-vector 9 'Z))
- => [Z Z Z Z Z Z Z Z Z]
-
- -- Function: vconcat &rest sequences
- This function returns a new vector containing all the elements of the
- sequences. The arguments sequences may be lists, vectors, or strings. If no
- sequences are given, an empty vector is returned.
-
- The value is a newly constructed vector that is not eq to any existing vector.
-
- (setq a (vconcat '(A B C) '(D E F)))
- => [A B C D E F]
- (eq a (vconcat a))
- => nil
- (vconcat)
- => []
- (vconcat [A B C] "aa" '(foo (6 7)))
- => [A B C 97 97 foo (6 7)]
-
- When an argument is an integer (not a sequence of integers), it is converted to
- a string of digits making up the decimal printed representation of the integer.
- This special case exists for compatibility with Mocklisp, and we don't
- recommend you take advantage of it. If you want to convert an integer in this
- way, use format (see Formatting Strings) or int-to-string ( see String
- Conversion).
-
- For other concatenation functions, see mapconcat in Mapping Functions, concat
- in Creating Strings, and append in Building Lists.
-
- The append function may be used to convert a vector into a list with the same
- elements (see Building Lists):
-
- (setq avector [1 two (quote (three)) "four" [five]])
- => [1 two (quote (three)) "four" [five]]
- (append avector nil)
- => (1 two (quote (three)) "four" [five])
-
-
- ΓòÉΓòÉΓòÉ 10. Symbols ΓòÉΓòÉΓòÉ
-
- A symbol is an object with a unique name. This chapter describes symbols,
- their components, and how they are created and interned. Property lists are
- also described. The uses of symbols as variables and as function names are
- described in separate chapters; see Variables, and Functions.
-
- You may test whether an arbitrary Lisp object is a symbol with symbolp:
-
- -- Function: symbolp object
- This function returns t if object is a symbol, nil otherwise.
-
-
- ΓòÉΓòÉΓòÉ 10.1. Symbol Components ΓòÉΓòÉΓòÉ
-
- Each symbol has four components (or ``cells''), each of which references
- another object:
-
- Print name
- The print name cell holds a string which names the symbol for reading
- and printing. See symbol-name in Creating Symbols.
-
- Value
- The value cell holds the current value of the symbol as a variable.
- When a symbol is used as a form, the value of the form is the
- contents of the symbol's value cell. See symbol-value in Accessing
- Variables.
-
- Function
- The function cell holds the function definition of the symbol. When a
- symbol is used as a function, its function definition is used in its
- place. This cell is also used by the editor command loop to record
- keymaps and keyboard macros. Because each symbol has separate value
- and function cells, variables and function names do not conflict.
- See symbol-function in Function Cells.
-
- Property list
- The property list cell holds the property list of the symbol. See
- symbol-plist in Property Lists.
-
- The print name cell always holds a string, and cannot be changed. The other
- three cells can be set individually to any specified Lisp object.
-
- The print name cell holds the string that is the name of the symbol. Since
- symbols are represented textually by their names, it is important not to have
- two symbols with the same name. The Lisp reader ensures this: every time it
- reads a symbol, it looks for an existing symbol with the specified name before
- it creates a new one. (In GNU Emacs Lisp, this is done with a hashing
- algorithm that uses an obarray; see Creating Symbols.)
-
- In normal usage, the function cell usually contains a function or macro, as
- that is what the Lisp interpreter expects to see there (see Evaluation).
- Keyboard macros (see Keyboard Macros), keymaps (see Keymaps) and autoload
- objects (see Autoloading) are also sometimes stored in the function cell of
- symbols. We often refer to ``the function foo'' when we really mean the
- function stored in the function cell of the symbol foo. The distinction will
- be made only when necessary.
-
- Similarly, the property list cell normally holds a correctly formatted
- property list (see Property Lists), as a number of functions will expect to see
- a property list there.
-
- The function cell or the value cell may be void, which means that the cell
- does not reference any object. (This is not the same thing as holding the
- symbol void, nor the same as holding the symbol nil.) Examining the value of a
- cell which is void results in an error, such as `Symbol's value as variable is
- void'.
-
- The four functions symbol-name, symbol-value, symbol-plist, and
- symbol-function return the contents of the four cells. Here as an example we
- show the contents of the four cells of the symbol buffer-file-name:
-
- (symbol-name 'buffer-file-name)
- => "buffer-file-name"
- (symbol-value 'buffer-file-name)
- => "/gnu/elisp/symbols.texi"
- (symbol-plist 'buffer-file-name)
- => (variable-documentation 29529)
- (symbol-function 'buffer-file-name)
- => #<subr buffer-file-name>
-
- Because this symbol is the variable which holds the name of the file being
- visited in the current buffer, the value cell contents we see are the name of
- the source file of this chapter of the Emacs Lisp Manual. The property list
- cell contains the list (variable-documentation 29529) which tells the
- documentation functions where to find documentation about buffer-file-name in
- the `DOC' file. (29529 is the offset from the beginning of the `DOC' file where
- the documentation for the function begins.) The function cell contains the
- function for returning the name of the file. Since buffer-file-name is a
- primitive function, its function definition has no read syntax and prints in
- hash notation ( see Primitive Function Type). A function definition written in
- Lisp will have a lambda expression (or byte-code) in this cell.
-
-
- ΓòÉΓòÉΓòÉ 10.2. Defining Symbols ΓòÉΓòÉΓòÉ
-
- A definition in Lisp is a special form that announces your intention to use a
- certain symbol in a particular way. In Emacs Lisp, you can define a symbol as
- a variable, or define it as a function (or macro), or both independently.
-
- A definition construct typically specifies a value or meaning for the symbol
- for one kind of use, plus documentation for its meaning when used in this way.
- Thus, when you define a symbol as a variable, you can supply an initial value
- for the variable, plus documentation for the variable.
-
- defvar and defconst are definitions that establish a symbol as a global
- variable. They are documented in detail in Defining Variables.
-
- defun defines a symbol as a function, creating a lambda expression and storing
- it in the function cell of the symbol. This lambda expression thus becomes the
- function definition of the symbol. (The term ``function definition'', meaning
- the contents of the function cell, is derived from the idea that defun gives
- the symbol its definition as a function.) See Functions.
-
- defmacro defines a symbol as a macro. It creates a macro object and stores it
- in the function cell of the symbol. Note that a given symbol can be a macro or
- a function, but not both at once, because both macro and function definitions
- are kept in the function cell, and that cell can hold only one Lisp object at
- any given time. See Macros.
-
- In GNU Emacs Lisp, a definition is not required in order to use a symbol as a
- variable or function. Thus, you can make a symbol a global variable with setq,
- whether you define it first or not. The real purpose of definitions is to
- guide programmers and programming tools. They inform programmers who read the
- code that certain symbols are intended to be used as variables, or as
- functions. In addition, utilities such as `etags' and `make-docfile' can
- recognize definitions, and add the appropriate information to tag tables and
- the `emacs/etc/DOC-version' file. See Accessing Documentation.
-
-
- ΓòÉΓòÉΓòÉ 10.3. Creating and Interning Symbols ΓòÉΓòÉΓòÉ
-
- To understand how symbols are created in GNU Emacs Lisp, it is necessary to
- know how Lisp reads them. It is essential to ensure that every time Lisp reads
- the same set of characters, it finds the same symbol. Failure to do so would be
- disastrous.
-
- When the Lisp reader encounters a symbol, it reads all the characters of the
- name. Then it ``hashes'' those characters to find an index in a table called
- an obarray. Hashing is an efficient method of looking something up. For
- example, instead of searching a telephone book cover to cover when looking up
- Jan Jones, you start with the J's and go from there. That is a simple version
- of hashing. Each element of the obarray is a bucket which holds all the
- symbols with a given hash code; to look for a given name, it is sufficient to
- look through all the symbols in the bucket for that name's hash code.
-
- If a symbol with the desired name is found, then it is used. If no such
- symbol is found, then a new symbol is created and added to the obarray bucket.
- Adding a symbol to an obarray is called interning it, and the symbol is then
- called an interned symbol. In Emacs Lisp, a symbol may be interned in only one
- obarray.
-
- Common Lisp note: in Common Lisp, a symbol may be interned in several obarrays
- at once.
-
- If a symbol is not in the obarray, then there is no way for Lisp to find it
- when its name is read. Such a symbol is called an uninterned symbol relative
- to the obarray. An uninterned symbol has all the other characteristics of
- symbols. It is possible, though uncommon, for two different symbols to have
- the same name in different obarrays; they are not eq or equal.
-
- In Emacs Lisp, an obarray is represented as a vector. Each element of the
- vector is a bucket; its value is either an interned symbol whose name hashes to
- that bucket, or 0 if the bucket is empty. Each interned symbol has an internal
- link (invisible to the user) to the next symbol in the bucket. Because these
- links are invisible, there is no way to scan the symbols in an obarray except
- using mapatoms (below). The order of symbols in a bucket is not significant.
-
- In an empty obarray, every element is 0, and you can create an obarray with
- (make-vector length 0). Prime numbers as lengths tend to result in good
- hashing; lengths one less than a power of two are also good.
-
- Most of the functions below take a name and sometimes an obarray as arguments.
- A wrong-type-argument error is signaled if the name is not a string, or if the
- obarray is not a vector.
-
- -- Function: symbol-name symbol
- This function returns the string that is symbol's name. For example:
-
- (symbol-name 'foo)
- => "foo"
-
- Changing the string by substituting characters, etc, will change the name of
- the symbol, but will fail to update the obarray, so don't do it!
-
- -- Function: make-symbol name
- This function returns a newly-allocated uninterned symbol whose name is name
- (which must be a string). Its value and function definition are void, and its
- property list is nil. In the example below, the value of sym is not eq to foo
- because it is a distinct uninterned symbol whose name is also `foo'.
-
- (setq sym (make-symbol "foo"))
- => foo
- (eq sym 'foo)
- => nil
-
- -- Function: intern name &optional obarray
- This function returns the interned symbol whose name is name. If there is no
- such symbol in the obarray, a new one is created, added to the obarray, and
- returned. If obarray is supplied, it specifies the obarray to use; otherwise,
- the value of the global variable obarray is used.
-
- (setq sym (intern "foo"))
- => foo
- (eq sym 'foo)
- => t
-
- -- Function: intern-soft name &optional obarray
- This function returns the symbol whose name is name, or nil if a symbol with
- that name is not found in the obarray. Therefore, you can use intern-soft to
- test whether a symbol with a given name is interned. If obarray is supplied,
- it specifies the obarray to use; otherwise the value of the global variable
- obarray is used.
-
- (intern-soft "frazzle") ; No such symbol exists.
- => nil
- (make-symbol "frazzle") ; Create an uninterned one.
- => frazzle
- (intern-soft "frazzle") ; That one cannot be found.
- => nil
- (setq sym (intern "frazzle")) ; Create an interned one.
- => frazzle
- (intern-soft "frazzle") ; That one can be found!
- => frazzle
- (eq sym 'frazzle) ; And it is the same one.
- => t
-
- -- Variable: obarray
- This variable is the standard obarray for use by intern and read.
-
- -- Function: mapatoms function &optional obarray
- This function applies function to every symbol in obarray. It returns nil. If
- obarray is not supplied, it defaults to the value of obarray, the standard
- obarray for ordinary symbols.
-
- (setq count 0)
- => 0
- (defun count-syms (s)
- (setq count (1+ count)))
- => count-syms
- (mapatoms 'count-syms)
- => nil
- count
- => 1871
-
- See documentation in Accessing Documentation, for another example using
- mapatoms.
-
-
- ΓòÉΓòÉΓòÉ 10.4. Property Lists ΓòÉΓòÉΓòÉ
-
- A property list (plist for short) is a list of paired elements stored in the
- property list cell of a symbol. Each of the pairs associates a property name
- (usually a symbol) with a property or value. Property lists are generally used
- to record information about a symbol, such as how to compile it, the name of
- the file where it was defined, or perhaps even the grammatical class of the
- symbol (representing a word) in a language understanding system.
-
- The property names and property values may be any Lisp objects, but the names
- are usually symbols. They are compared using eq. Here is an example of a
- property list, found on the symbol progn when the compiler is loaded:
-
- (lisp-indent-hook 0 byte-compile byte-compile-progn)
-
- Here lisp-indent-hook and byte-compile are property names, and the other two
- elements are the corresponding values.
-
- Association lists (see Association Lists) are very similar to property lists.
- In contrast to association lists, the order of the pairs in the property list
- is not significant since the property names must be distinct.
-
- Property lists are better than association lists when it is necessary to
- attach information to various Lisp function names or variables. If all the
- pairs are recorded in one association list, it will be necessary to search that
- entire list each time a function or variable is to be operated on. By
- contrast, if the information is recorded in the property lists of the function
- names or variables themselves, each search will scan only the length of one
- property list, which is usually short. For this reason, the documentation for
- a variable is recorded in a property named variable-documentation. The byte
- compiler likewise uses properties to record those functions needing special
- treatment.
-
- However, association lists have their own advantages. Depending on your
- application, it may be faster to add an association to the front of an
- association list than to update a property. All properties for a symbol are
- stored in the same property list, so there is a possibility of a conflict
- between different uses of a property name. (For this reason, it is a good idea
- to use property names that are probably unique, such as by including the name
- of the library in the property name.) An association list may be used like a
- stack where associations are pushed on the front of the list and later
- discarded; this is not possible with a property list.
-
- -- Function: symbol-plist symbol
- This function returns the property list of symbol.
-
- -- Function: setplist symbol plist
- This function sets symbol's property list to plist. Normally, plist should be
- a well-formed property list, but this is not enforced.
-
- (setplist 'foo '(a 1 b (2 3) c nil))
- => (a 1 b (2 3) c nil)
- (symbol-plist 'foo)
- => (a 1 b (2 3) c nil)
-
- For symbols in special obarrays, which are not used for ordinary purposes, it
- may make sense to use the property list cell in a nonstandard fashion; in fact,
- the abbrev mechanism does so (see Abbrevs).
-
- -- Function: get symbol property
- This function finds the value of the property named property in symbol's
- property list. If there is no such property, nil is returned. Thus, there is
- no distinction between a value of nil and the absence of the property.
-
- The name property is compared with the existing property names using eq, so any
- object is a legitimate property.
-
- See put for an example.
-
- -- Function: put symbol property value
- This function puts value onto symbol's property list under the property name
- property, replacing any previous value.
-
- (put 'fly 'verb 'transitive)
- =>'transitive
- (put 'fly 'noun '(a buzzing little bug))
- => (a buzzing little bug)
- (get 'fly 'verb)
- => transitive
- (symbol-plist 'fly)
- => (verb transitive noun (a buzzing little bug))
-
-
- ΓòÉΓòÉΓòÉ 11. Evaluation ΓòÉΓòÉΓòÉ
-
- The evaluation of expressions in Emacs Lisp is performed by the Lisp
- interpreter---a program that receives a Lisp object as input and computes its
- value as an expression. The value is computed in a fashion that depends on the
- data type of the object, following rules described in this chapter. The
- interpreter runs automatically to evaluate portions of your program, but can
- also be called explicitly via the Lisp primitive function eval.
-
-
- ΓòÉΓòÉΓòÉ 11.1. Introduction to Evaluation ΓòÉΓòÉΓòÉ
-
- The Lisp interpreter, or evaluator, is the program which computes the value of
- an expression which is given to it. When a function written in Lisp is called,
- the evaluator computes the value of the function by evaluating the expressions
- in the function body. Thus, running any Lisp program really means running the
- Lisp interpreter.
-
- How the evaluator handles an object depends primarily on the data type of the
- object.
-
- A Lisp object which is intended for evaluation is called an expression or a
- form. The fact that expressions are data objects and not merely text is one of
- the fundamental differences between Lisp-like languages and typical programming
- languages. Any object can be evaluated, but in practice only numbers, symbols,
- lists and strings are evaluated very often.
-
- It is very common to read a Lisp expression and then evaluate the expression,
- but reading and evaluation are separate activities, and either can be performed
- alone. Reading per se does not evaluate anything; it converts the printed
- representation of a Lisp object to the object itself. It is up to the caller
- of read whether this object is a form to be evaluated, or serves some entirely
- different purpose. See Input Functions.
-
- Do not confuse evaluation with command key interpretation. The editor command
- loop translates keyboard input into a command (an interactively callable
- function) using the current keymaps, and then uses call-interactively to invoke
- the command. The execution of the command itself involves evaluation if the
- command is written in Lisp, but that is not a part of command key
- interpretation itself. See Command Loop.
-
- Evaluation is a recursive process. That is, evaluation of a form may cause
- eval to be called again in order to evaluate parts of the form. For example,
- evaluation of a function call first evaluates each argument of the function
- call, and then evaluates each form in the function body. Consider evaluation
- of the form (car x): the subform x must first be evaluated recursively, so that
- its value can be passed as an argument to the function car.
-
- The evaluation of forms takes place in a context called the environment, which
- consists of the current values and bindings of all Lisp variables. Whenever
- the form refers to a variable without creating a new binding for it, the value
- of the current binding is used. See Variables.
-
- Evaluation of a form may create new environments for recursive evaluation by
- binding variables (see Local Variables). These environments are temporary and
- will be gone by the time evaluation of the form is complete. The form may also
- make changes that persist; these changes are called side-effects. An example
- of a form that produces side-effects is (setq foo 1).
-
- Finally, evaluation of one particular function call, byte-code, invokes the
- byte-code interpreter on its arguments. Although the byte-code interpreter is
- not the same as the Lisp interpreter, it uses the same environment as the Lisp
- interpreter, and may on occasion invoke the Lisp interpreter. (See Byte
- Compilation.)
-
- The details of what evaluation means for each kind of form are described below
- (see Forms).
-
-
- ΓòÉΓòÉΓòÉ 11.2. Eval ΓòÉΓòÉΓòÉ
-
- Most often, forms are evaluated automatically, by virtue of their occurrence
- in a program being run. On rare occasions, you may need to write code that
- evaluates a form that is computed at run time, such as when the form is read
- from text being edited or found on a property list. On these occasions, use
- the eval function.
-
- The functions and variables described in this section evaluate forms, specify
- limits to the evaluation process, or record recently returned values.
- Evaluation is also performed by load (see Loading).
-
- -- Function: eval form
- This is the basic function for performing evaluation. It evaluates form in
- the current environment and returns the result. How the evaluation proceeds
- depends on the type of the object (see Forms).
-
- Since eval is a function, the argument expression that appears in a call to
- eval is evaluated twice: once as preparation before eval is called, and again
- by the eval function itself. Here is an example:
-
- (setq foo 'bar)
- => bar
- (setq bar 'baz)
- => baz
- ;; eval is called on the form bar, which is the value of foo
- (eval foo)
- => baz
-
- The number of currently active calls to eval is limited to
- max-lisp-eval-depth.
-
- -- Command: eval-current-buffer &optional stream
- This function evaluates the forms in the current buffer. It reads forms from
- the buffer and calls eval on them until the end of the buffer is reached, or
- until an error is signaled and not handled.
-
- If stream is supplied, the variable standard-output is bound to stream during
- the evaluation ( see Output Functions).
-
- eval-current-buffer always returns nil.
-
- -- Command: eval-region start end &optional stream
- This function evaluates the forms in the current buffer in the region defined
- by the positions start and end. It reads forms from the region and calls eval
- on them until the end of the region is reached, or until an error is signaled
- and not handled.
-
- If stream is supplied, standard-output is bound to it for the duration of the
- command.
-
- eval-region always returns nil.
-
- -- Variable: max-lisp-eval-depth
- This variable defines the maximum depth allowed in calls to eval, apply, and
- funcall before an error is signaled (with error message "Lisp nesting exceeds
- max-lisp-eval-depth"). eval is called recursively to evaluate the arguments of
- Lisp function calls and to evaluate bodies of functions.
-
- This limit, with the associated error when it is exceeded, is one way that
- Lisp avoids infinite recursion on an ill-defined function.
-
- The default value of this variable is 200. If you set it to a value less than
- 100, Lisp will reset it to 100 if the given value is reached.
-
- -- Variable: values
- The value of this variable is a list of values returned by all expressions
- which were read from buffers (including the minibuffer), evaluated, and
- printed. The elements are in order, most recent first.
-
- (setq x 1)
- => 1
- (list 'A (1+ 2) auto-save-default)
- => (A 3 t)
- values
- => ((A 3 t) 1 ...)
-
- This variable is useful for referring back to values of forms recently
- evaluated. It is generally a bad idea to print the value of values itself,
- since this may be very long. Instead, examine particular elements, like this:
-
- ;; Refer to the most recent evaluation result.
- (nth 0 values)
- => (A 3 t)
- ;; That put a new element on, so all elements move back one.
- (nth 1 values)
- => (A 3 t)
- ;; This gets the element that was next-to-last before this example.
- (nth 3 values)
- => 1
-
-
- ΓòÉΓòÉΓòÉ 11.3. Kinds of Forms ΓòÉΓòÉΓòÉ
-
- A Lisp object that is intended to be evaluated is called a form. How Emacs
- evaluates a form depends on its data type. Emacs has three different kinds of
- form that are evaluated differently: symbols, lists, and ``all other types''.
- All three kinds are described in this section, starting with ``all other
- types'' which are self-evaluating forms.
-
-
- ΓòÉΓòÉΓòÉ 11.3.1. Self-Evaluating Forms ΓòÉΓòÉΓòÉ
-
- A self-evaluating form is any form that is not a list or symbol.
- Self-evaluating forms evaluate to themselves: the result of evaluation is the
- same object that was evaluated. Thus, the number 25 evaluates to 25, and the
- string "foo" evaluates to the string "foo". Likewise, evaluation of a vector
- does not cause evaluation of the elements of the vector---it returns the same
- vector with its contents unchanged.
-
- '123 ; An object, shown without evaluation.
- => 123
- 123 ; Evaluated as usual---result is the same.
- => 123
- (eval '123) ; Evaluated ``by hand''---result is the same.
- => 123
- (eval (eval '123)) ; Evaluating twice changes nothing.
- => 123
-
- It is common to write numbers, characters, strings, and even vectors in Lisp
- code, taking advantage of the fact that they self-evaluate. However, it is
- quite unusual to do this for types that lack a read syntax, because it is
- inconvenient and not very useful; however, it is possible to put them inside
- Lisp programs when they are constructed from subexpressions rather than read.
- Here is an example:
-
- ;; Build such an expression.
- (setq buffer (list 'print (current-buffer)))
- => (print #<buffer eval.texi>)
- ;; Evaluate it.
- (eval buffer)
- -| #<buffer eval.texi>
- => #<buffer eval.texi>
-
-
- ΓòÉΓòÉΓòÉ 11.3.2. Symbol Forms ΓòÉΓòÉΓòÉ
-
- When a symbol is evaluated, it is treated as a variable. The result is the
- variable's value, if it has one. If it has none (if its value cell is void),
- an error is signaled. For more information on the use of variables, see
- Variables.
-
- In the following example, the value of a symbol is set with setq. When the
- symbol is later evaluated, that value is returned.
-
- (setq a 123)
- => 123
- (eval 'a)
- => 123
- a
- => 123
-
- The symbols nil and t are treated specially, so that the value of nil is
- always nil, and the value of t is always t. Thus, these two symbols act like
- self-evaluating forms, even though eval treats them like any other symbol.
-
-
- ΓòÉΓòÉΓòÉ 11.3.3. Classification of List Forms ΓòÉΓòÉΓòÉ
-
- A form that is a nonempty list is either a function call, a macro call, or a
- special form, according to its first element. These three kinds of forms are
- evaluated in different ways, described below. The rest of the list consists of
- arguments for the function, macro or special form.
-
- The first step in evaluating a nonempty list is to examine its first element.
- This element alone determines what kind of form the list is and how the rest of
- the list is to be processed. The first element is not evaluated, as it would
- be in some Lisp dialects including Scheme.
-
- If the first element of the list is a symbol, as it most commonly is, then the
- symbol's function cell is examined, and its contents are used instead of the
- original symbol. If the contents are another symbol, this process, called
- symbol function indirection, is repeated until a non-symbol is obtained.
-
- One possible consequence of this process is an infinite loop, in the event
- that a symbol's function cell refers to the same symbol. Or a symbol may have
- a void function cell, causing a void-function error. But if neither of these
- things happens, we eventually obtain a non-symbol, which ought to be a function
- or other suitable object.
-
- More precisely, we should now have a Lisp function (a lambda expression), a
- primitive function, a Lisp macro, a special form, or an autoload object. Each
- of these types is a case described in one of the following sections. If the
- object is not one of these types, the error invalid-function is signaled.
-
- The following example illustrates the symbol indirection process. We use fset
- to set the function cell of a symbol and symbol-function to get the function
- cell contents (see Function Cells). Specifically, we store the symbol car into
- the function cell of first, and the symbol first into the function cell of
- erste.
-
- ;; Build this function cell linkage:
- ;; ------------- ----- ------- -------
- ;; | #<subr car> | <-- | car | <-- | first | <-- | erste |
- ;; ------------- ----- ------- -------
-
- (symbol-function 'car)
- => #<subr car>
- (fset 'first 'car)
- => car
- (fset 'erste 'first)
- => first
- (erste '(1 2 3)) ; Call the function referenced by erste.
- => 1
-
- By contrast, the following example calls a function without any symbol
- function indirection, because the first element is an anonymous Lisp function,
- not a symbol.
-
- ((lambda (arg) (erste arg))
- '(1 2 3))
- => 1
-
- After that function is called, its body is evaluated; this does involve symbol
- function indirection when calling erste.
-
-
- ΓòÉΓòÉΓòÉ 11.3.4. Evaluation of Function Forms ΓòÉΓòÉΓòÉ
-
- If the first element of a list being evaluated is a Lisp function object or
- primitive function object, then that list is a function call. For example,
- here is a call to the function +:
-
- (+ 1 x)
-
- When a function call is evaluated, the first step is to evaluate the remaining
- elements of the list in the order they appear. The results are the actual
- argument values, one argument from each element. Then the function is called
- with this list of arguments, effectively using the function apply (see Calling
- Functions). If the function is written in Lisp, the arguments are used to bind
- the argument variables of the function (see Lambda Expressions); then the forms
- in the function body are evaluated in order, and the result of the last one is
- used as the value of the function call.
-
-
- ΓòÉΓòÉΓòÉ 11.3.5. Lisp Macro Evaluation ΓòÉΓòÉΓòÉ
-
- If the first element of a list being evaluated is a macro object, then the
- list is a macro call. When a macro call is evaluated, the elements of the rest
- of the list are not initially evaluated. Instead, these elements themselves are
- used as the arguments of the macro. The macro definition computes a
- replacement form, called the expansion of the macro, which is evaluated in
- place of the original form. The expansion may be any sort of form: a
- self-evaluating constant, a symbol or a list. If the expansion is itself a
- macro call, this process of expansion repeats until some other sort of form
- results.
-
- Normally, the argument expressions are not evaluated as part of computing the
- macro expansion, but instead appear as part of the expansion, so they are
- evaluated when the expansion is evaluated.
-
- For example, given a macro defined as follows:
-
- (defmacro cadr (x)
- (list 'car (list 'cdr x)))
-
- an expression such as (cadr (assq 'handler list)) is a macro call, and its
- expansion is:
-
- (car (cdr (assq 'handler list)))
-
- Note that the argument (assq 'handler list) appears in the expansion.
-
- See Macros, for a complete description of Emacs Lisp macros.
-
-
- ΓòÉΓòÉΓòÉ 11.3.6. Special Forms ΓòÉΓòÉΓòÉ
-
- A special form is a primitive function specially marked so that its arguments
- are not all evaluated. Special forms define control structures or perform
- variable bindings---things which functions cannot do.
-
- Each special form has its own rules for which arguments are evaluated and
- which are used without evaluation. Whether a particular argument is evaluated
- may depend on the results of evaluating other arguments.
-
- Here is a list, in alphabetical order, of all of the special forms in Emacs
- Lisp with a reference to where each is described.
-
- and
- see Combining Conditions
-
- catch
- see Catch and Throw
-
- cond
- see Conditionals
-
- condition-case
- see Errors
-
- defconst
- see Defining Variables
-
- defmacro
- see Defining Macros
-
- defun
- see Defining Functions
-
- defvar
- see Defining Variables
-
- function
- see Anonymous Functions
-
- if
- see Conditionals
-
- interactive
- see Interactive Call
-
- let
- see Local Variables
-
- let*
- see Local Variables
-
- or
- see Combining Conditions
-
- prog1
- see Sequencing
-
- prog2
- see Sequencing
-
- progn
- see Sequencing
-
- quote
- see Quoting
-
- save-excursion
- see Excursions
-
- save-restriction
- see Narrowing
-
- save-window-excursion
- see Window Configurations
-
- setq
- see Setting Variables
-
- setq-default
- see Creating Buffer-Local
-
- unwind-protect
- see Nonlocal Exits
-
- while
- see Iteration
-
- with-output-to-temp-buffer
- see Temporary Displays
-
- Common Lisp note: here are some comparisons of special forms in GNU Emacs Lisp
- and Common Lisp. setq, if, and catch are special forms in both Emacs Lisp and
- Common Lisp. defun is a special form in Emacs Lisp, but a macro in Common Lisp.
- save-excursion is a special form in Emacs Lisp, but doesn't exist in Common
- Lisp. throw is a special form in Common Lisp (because it must be able to throw
- multiple values), but it is a function in Emacs Lisp (which doesn't have
- multiple values).
-
-
- ΓòÉΓòÉΓòÉ 11.3.7. Autoloading ΓòÉΓòÉΓòÉ
-
- The autoload feature allows you to call a function or macro whose function
- definition has not yet been loaded into Emacs. When an autoload object appears
- as a symbol's function definition and that symbol is used as a function, Emacs
- will automatically install the real definition (plus other associated code) and
- then call that definition. (See Autoload.)
-
-
- ΓòÉΓòÉΓòÉ 11.4. Quoting ΓòÉΓòÉΓòÉ
-
- The special form quote returns its single argument ``unchanged''.
-
- -- Special Form: quote object
- This special form returns object, without evaluating it. This allows symbols
- and lists, which would normally be evaluated, to be included literally in a
- program. (It is not necessary to quote numbers, strings, and vectors since
- they are self-evaluating.) Use function instead of quote when quoting lambda
- expressions (see Anonymous Functions).
-
- Because quote is used so often in programs, a convenient read syntax is defined
- for it. An apostrophe character (`'') followed by a Lisp object (in read
- syntax) expands to a list whose first element is quote, and whose second
- element is the object. Thus, the read syntax 'x is an abbreviation for (quote
- x).
-
- Here are some examples of expressions that use quote:
-
- (quote (+ 1 2))
- => (+ 1 2)
- (quote foo)
- => foo
- 'foo
- => foo
- ''foo
- => (quote foo)
- '(quote foo)
- => (quote foo)
- ['foo]
- => [(quote foo)]
-
-
- ΓòÉΓòÉΓòÉ 12. Control Structures ΓòÉΓòÉΓòÉ
-
- A Lisp program consists of expressions or forms (see Forms). We control the
- order of execution of the forms by enclosing them in control structures.
- Control structures are special forms which control when, whether, or how many
- times to execute the forms they contain.
-
- The simplest control structure is sequential execution: first form a, then
- form b, and so on. This is what happens when you write several forms in
- succession in the body of a function, or at top level in a file of Lisp
- code---the forms are executed in the order they are written. We call this
- textual order. For example, if a function body consists of two forms a and b,
- evaluation of the function evaluates first a and then b, and the function's
- value is the value of b.
-
- Naturally, Emacs Lisp has many kinds of control structures, including other
- varieties of sequencing, function calls, conditionals, iteration, and
- (controlled) jumps. The built-in control structures are special forms since
- their subforms are not necessarily evaluated. You can use macros to define
- your own control structure constructs (see Macros).
-
-
- ΓòÉΓòÉΓòÉ 12.1. Sequencing ΓòÉΓòÉΓòÉ
-
- Evaluating forms in the order they are written is the most common control
- structure. Sometimes this happens automatically, such as in a function body.
- Elsewhere you must use a control structure construct to do this: progn, the
- simplest control construct of Lisp.
-
- A progn special form looks like this:
-
- (progn a b c ...)
-
- and it says to execute the forms a, b, c and so on, in that order. These forms
- are called the body of the progn form. The value of the last form in the body
- becomes the value of the entire progn.
-
- When Lisp was young, progn was the only way to execute two or more forms in
- succession and use the value of the last of them. But programmers found they
- often needed to use a progn in the body of a function, where (at that time)
- only one form was allowed. So the body of a function was made into an
- ``implicit progn'': several forms are allowed just as in the body of an actual
- progn. Many other control structures likewise contain an implicit progn. As a
- result, progn is not used as often as it used to be. It is needed now most
- often inside of an unwind-protect, and, or or.
-
- -- Special Form: progn forms...
- This special form evaluates all of the forms, in textual order, returning the
- result of the final form.
-
- (progn (print "The first form")
- (print "The second form")
- (print "The third form"))
- -| "The first form"
- -| "The second form"
- -| "The third form"
- => "The third form"
-
- Two other control constructs likewise evaluate a series of forms but return a
- different value:
-
- -- Special Form: prog1 form1 forms...
- This special form evaluates form1 and all of the forms, in textual order,
- returning the result of form1.
-
- (prog1 (print "The first form")
- (print "The second form")
- (print "The third form"))
- -| "The first form"
- -| "The second form"
- -| "The third form"
- => "The first form"
-
- Here is a way to remove the first element from a list in the variable x, then
- return the value of that former element:
-
- (prog1 (car x) (setq x (cdr x)))
-
- -- Special Form: prog2 form1 form2 forms...
- This special form evaluates form1, form2, and all of the following forms, in
- textual order, returning the result of form2.
-
- (prog2 (print "The first form")
- (print "The second form")
- (print "The third form"))
- -| "The first form"
- -| "The second form"
- -| "The third form"
- => "The second form"
-
-
- ΓòÉΓòÉΓòÉ 12.2. Conditionals ΓòÉΓòÉΓòÉ
-
- Conditional control structures choose among alternatives. Emacs Lisp has two
- conditional forms: if, which is much the same as in other languages, and cond,
- which is a generalized case statement.
-
- -- Special Form: if condition then-form else-forms...
- if chooses between the then-form and the else-forms based on the value of
- condition. If the evaluated condition is non-nil, then-form is evaluated and
- the result returned. Otherwise, the else-forms are evaluated in textual order,
- and the value of the last one is returned. (The else part of if is an example
- of an implicit progn. See Sequencing.)
-
- If condition has the value nil, and no else-forms are given, if returns nil.
-
- if is a special form because the branch which is not selected is never
- evaluated---it is ignored. Thus, in the example below, true is not printed
- because print is never called.
-
- (if nil
- (print 'true)
- 'very-false)
- => very-false
-
- -- Special Form: cond clause...
- cond chooses among an arbitrary number of alternatives. Each clause in the
- cond must be a list. The car of this list is the condition; the remaining
- elements, if any, the body-forms. Thus, a clause looks like this:
-
- (condition body-forms...)
-
- cond tries the clauses in textual order, by evaluating the condition of each
- clause. If the value of condition is non-nil, the body-forms are evaluated,
- and the value of the last of body-forms becomes the value of the cond. The
- remaining clauses are ignored.
-
- If the value of condition is nil, the clause ``fails'', so the cond moves on to
- the following clause, trying its condition.
-
- If every condition evaluates to nil, so that every clause fails, cond returns
- nil.
-
- A clause may also look like this:
-
- (condition)
-
- Then, if condition is non-nil when tested, the value of condition becomes the
- value of the cond form.
-
- The following example has four clauses, which test for the cases where the
- value of x is a number, string, buffer and symbol, respectively:
-
- (cond ((numberp x) x)
- ((stringp x) x)
- ((bufferp x)
- (setq temporary-hack x) ; multiple body-forms
- (buffer-name x)) ; in one clause
- ((symbolp x) (symbol-value x)))
-
- Often we want the last clause to be executed whenever none of the previous
- clauses was successful. To do this, we use t as the condition of the last
- clause, like this: (t body-forms). The form t evaluates to t, which is never
- nil, so this clause never fails, provided the cond gets to it at all.
-
- For example,
-
- (cond ((eq a 1) 'foo)
- (t "default"))
- => "default"
-
- This expression is a cond which returns foo if the value of a is 1, and returns
- the string "default" otherwise.
-
- Both cond and if can usually be written in terms of the other. Therefore, the
- choice between them is a matter of taste and style. For example:
-
- (if a b c)
- ==
- (cond (a b) (t c))
-
-
- ΓòÉΓòÉΓòÉ 12.3. Constructs for Combining Conditions ΓòÉΓòÉΓòÉ
-
- This section describes three constructs that are often used together with if
- and cond to express complicated conditions. The constructs and and or can also
- be used individually as kinds of multiple conditional constructs.
-
- -- Function: not condition
- This function tests for the falsehood of condition. It returns t if condition
- is nil, and nil otherwise. The function not is identical to null, and we
- recommend using null if you are testing for an empty list.
-
- -- Special Form: and conditions...
- The and special form tests whether all the conditions are true. It works by
- evaluating the conditions one by one in the order written.
-
- If any of the conditions evaluates to nil, then the result of the and must be
- nil regardless of the remaining conditions; so the remaining conditions are
- ignored and the and returns right away.
-
- If all the conditions turn out non-nil, then the value of the last of them
- becomes the value of the and form.
-
- Here is an example. The first condition returns the integer 1, which is not
- nil. Similarly, the second condition returns the integer 2, which is not nil.
- The third condition is nil, so the remaining condition is never evaluated.
-
- (and (print 1) (print 2) nil (print 3))
- -| 1
- -| 2
- => nil
-
- Here is a more realistic example of using and:
-
- (if (and (consp foo) (eq (car foo) 'x))
- (message "foo is a list starting with x"))
-
- Note that (car foo) is not executed if (consp foo) returns nil, thus avoiding
- an error.
-
- and can be expressed in terms of either if or cond. For example:
-
- (and arg1 arg2 arg3)
- ==
- (if arg1 (if arg2 arg3))
- ==
- (cond (arg1 (cond (arg2 arg3))))
-
- -- Special Form: or conditions...
- The or special form tests whether at least one of the conditions is true. It
- works by evaluating all the conditions one by one in the order written.
-
- If any of the conditions evaluates to a non-nil value, then the result of the
- or must be non-nil; so the remaining conditions are ignored and the or returns
- right away. The value it returns is the non-nil value of the condition just
- evaluated.
-
- If all the conditions turn out nil, then the or expression returns nil.
-
- For example, this expression tests whether x is either 0 or nil:
-
- (or (eq x nil) (= x 0))
-
- Like the and construct, or can be written in terms of cond. For example:
-
- (or arg1 arg2 arg3)
- ==
- (cond (arg1)
- (arg2)
- (arg3))
-
- You could almost write or in terms of if, but not quite:
-
- (if arg1 arg1
- (if arg2 arg2
- arg3))
-
- This is not completely equivalent because it can evaluate arg1 or arg2 twice.
- By contrast, (or arg1 arg2 arg3) never evaluates any argument more than once.
-
-
- ΓòÉΓòÉΓòÉ 12.4. Iteration ΓòÉΓòÉΓòÉ
-
- Iteration means executing part of a program repetitively. For example, you
- might want to repeat some expressions once for each element of a list, or once
- for each integer from 0 to n. You can do this in Emacs Lisp with the special
- form while:
-
- -- Special Form: while condition forms...
- while first evaluates condition. If the result is non-nil, it evaluates forms
- in textual order. Then it reevaluates condition, and if the result is non-nil,
- it evaluates forms again. This process repeats until condition evaluates to
- nil.
-
- There is no limit on the number of iterations that may occur. The loop will
- continue until either condition evaluates to nil or until an error or throw
- jumps out of it (see Nonlocal Exits).
-
- The value of a while form is always nil.
-
- (setq num 0)
- => 0
- (while (< num 4)
- (princ (format "Iteration %d." num))
- (setq num (1+ num)))
- -| Iteration 0.
- -| Iteration 1.
- -| Iteration 2.
- -| Iteration 3.
- => nil
-
- If you would like to execute something on each iteration before the end-test,
- put it together with the end-test in a progn as the first argument of while, as
- shown here:
-
- (while (progn
- (forward-line 1)
- (not (looking-at "^$"))))
-
- This moves forward one line and continues moving by lines until an empty line
- is reached.
-
-
- ΓòÉΓòÉΓòÉ 12.5. Nonlocal Exits ΓòÉΓòÉΓòÉ
-
- A nonlocal exit is a transfer of control from one point in a program to
- another remote point. Nonlocal exits can occur in Emacs Lisp as a result of
- errors; you can also use them under explicit control.
-
-
- ΓòÉΓòÉΓòÉ 12.5.1. Explicit Nonlocal Exits: catch and throw ΓòÉΓòÉΓòÉ
-
- Most control constructs affect only the flow of control within the construct
- itself. The function throw is the sole exception: it performs a nonlocal exit
- on request. throw is used inside a catch, and jumps back to that catch. For
- example:
-
- (catch 'foo
- (progn
- ...
- (throw 'foo t)
- ...))
-
- The throw transfers control straight back to the corresponding catch, which
- returns immediately. The code following the throw is not executed. The second
- argument of throw is used as the return value of the catch.
-
- The throw and the catch are matched through the first argument: throw searches
- for a catch whose first argument is eq to the one specified. Thus, in the
- above example, the throw specifies foo, and the catch specifies the same
- symbol, so that catch is applicable. If there is more than one applicable
- catch, the innermost one takes precedence.
-
- All Lisp constructs between the catch and the throw, including function calls,
- are exited automatically along with the catch. When binding constructs such as
- let or function calls are exited in this way, the bindings are unbound, just as
- they are when the binding construct is exited normally (see Local Variables).
- Likewise, the buffer and position saved by save-excursion (see Excursions) are
- restored, and so is the narrowing status saved by save-restriction and the
- window selection saved by save-window-excursion (see Window Configurations).
- Any cleanups established with the unwind-protect special form are executed if
- the unwind-protect is exited with a throw.
-
- The throw need not appear lexically within the catch that it jumps to. It can
- equally well be called from another function called within the catch. As long
- as the throw takes place chronologically after entry to the catch, and
- chronologically before exit from it, it has access to that catch. This is why
- throw can be used in commands such as exit-recursive-edit which throw back to
- the editor command loop (see Recursive Editing).
-
- Common Lisp note: most other versions of Lisp, including Common Lisp, have
- several ways of transferring control nonsequentially: return, return-from, and
- go, for example. Emacs Lisp has only throw.
-
- -- Special Form: catch tag body...
- catch establishes a return point for the throw function. The return point is
- distinguished from other such return points by tag, which may be any Lisp
- object. The argument tag is evaluated normally before the return point is
- established.
-
- With the return point in effect, the forms of the body are evaluated in textual
- order. If the forms execute normally, without error or nonlocal exit, the
- value of the last body form is returned from the catch.
-
- If a throw is done within body specifying the same value tag, the catch exits
- immediately; the value it returns is whatever was specified as the second
- argument of throw.
-
- -- Function: throw tag value
- The purpose of throw is to return from a return point previously established
- with catch. The argument tag is used to choose among the various existing
- return points; it must be eq to the value specified in the catch. If multiple
- return points match tag, the innermost one is used.
-
- The argument value is used as the value to return from that catch.
-
- If no return point is in effect with tag tag, then a no-catch error is signaled
- with data (tag value).
-
-
- ΓòÉΓòÉΓòÉ 12.5.2. Examples of catch and throw ΓòÉΓòÉΓòÉ
-
- One way to use catch and throw is to exit from a doubly nested loop. (In most
- languages, this would be done with a ``go to''.) Here we compute (foo i j) for
- i and j varying from 0 to 9:
-
- (defun search-foo ()
- (catch 'loop
- (let ((i 0))
- (while (< i 10)
- (let ((j 0))
- (while (< j 10)
- (if (foo i j)
- (throw 'loop (list i j)))
- (setq j (1+ j))))
- (setq i (1+ i))))))
-
- If foo ever returns non-nil, we stop immediately and return a list of i and j.
- If foo always returns nil, the catch returns normally, and the value is nil,
- since that is the result of the while.
-
- Here are two tricky examples, slightly different, showing two return points at
- once. First, two return points with the same tag, hack:
-
- (defun catch2 (tag)
- (catch tag
- (throw 'hack 'yes)))
- => catch2
-
- (catch 'hack
- (print (catch2 'hack))
- 'no)
- -| yes
- => no
-
- Since both return points have tags that match the throw, it goes to the inner
- one, the one established in catch2. Therefore, catch2 returns normally with
- value yes, and this value is printed. Finally the second body form in the
- outer catch, which is 'no, is evaluated and returned from the outer catch.
-
- Now let's change the argument given to catch2:
-
- (defun catch2 (tag)
- (catch tag
- (throw 'hack 'yes)))
- => catch2
-
- (catch 'hack
- (print (catch2 'quux))
- 'no)
- => yes
-
- We still have two return points, but this time only the outer one has the tag
- hack; the inner one has the tag quux instead. Therefore, the throw returns the
- value yes from the outer return point. The function print is never called, and
- the body-form 'no is never evaluated.
-
-
- ΓòÉΓòÉΓòÉ 12.5.3. Errors ΓòÉΓòÉΓòÉ
-
- When Emacs Lisp attempts to evaluate a form that, for some reason, cannot be
- evaluated, it signals an error.
-
- When an error is signaled, Emacs's default reaction is to print an error
- message and terminate execution of the current command. This is the right
- thing to do in most cases, such as if you type C-f at the end of the buffer.
-
- In complicated programs, simple termination may not be what you want. For
- example, the program may have made temporary changes in data structures, or
- created temporary buffers which should be deleted before the program is
- finished. In such cases, you would use unwind-protect to establish cleanup
- expressions to be evaluated in case of error. Occasionally, you may wish the
- program to continue execution despite an error in a subroutine. In these
- cases, you would use condition-case to establish error handlers to recover
- control in case of error.
-
- Resist the temptation to use error handling to transfer control from one part
- of the program to another; use catch and throw. See Catch and Throw.
-
-
- ΓòÉΓòÉΓòÉ 12.5.3.1. How to Signal an Error ΓòÉΓòÉΓòÉ
-
- Most errors are signaled ``automatically'' within Lisp primitives which you
- call for other purposes, such as if you try to take the car of an integer or
- move forward a character at the end of the buffer; you can also signal errors
- explicitly with the functions error and signal.
-
- -- Function: error format-string &rest args
- This function signals an error with an error message constructed by applying
- format (see String Conversion) to format-string and args.
-
- Typical uses of error is shown in the following examples:
-
- (error "You have committed an error. Try something else.")
- error--> You have committed an error. Try something else.
-
- (error "You have committed %d errors. You don't learn fast." 10)
- error--> You have committed 10 errors. You don't learn fast.
-
- error works by calling signal with two arguments: the error symbol error, and a
- list containing the string returned by format.
-
- If you want to use a user-supplied string as an error message verbatim, don't
- just write (error string). If string contains `%', it will be interpreted as a
- format specifier, with undesirable results. Instead, use (error "%s" string).
-
- -- Function: signal error-symbol data
- This function signals an error named by error-symbol. The argument data is a
- list of additional Lisp objects relevant to the circumstances of the error.
-
- The argument error-symbol must be an error symbol---a symbol that has an
- error-conditions property whose value is a list of condition names. This is
- how different sorts of errors are classified.
-
- The number and significance of the objects in data depends on error-symbol.
- For example, with a wrong-type-arg error, there are two objects in the list: a
- predicate which describes the type that was expected, and the object which
- failed to fit that type. See Error Names, for a description of error symbols.
-
- Both error-symbol and data are available to any error handlers which handle the
- error: a list (error-symbol . data) is constructed to become the value of the
- local variable bound in the condition-case form (see Handling Errors). If the
- error is not handled, both of them are used in printing the error message.
-
- (signal 'wrong-number-of-arguments '(x y))
- error--> Wrong number of arguments: x, y
-
- (signal 'no-such-error '("My unknown error condition."))
- error--> peculiar error: "My unknown error condition."
-
- Common Lisp note: Emacs Lisp has nothing like the Common Lisp concept of
- continuable errors.
-
-
- ΓòÉΓòÉΓòÉ 12.5.3.2. How Emacs Processes Errors ΓòÉΓòÉΓòÉ
-
- When an error is signaled, Emacs searches for an active handler for the error.
- A handler is a specially marked place in the Lisp code of the current function
- or any of the functions by which it was called. If an applicable handler
- exists, its code is executed, and control resumes following the handler. The
- handler executes in the environment of the condition-case which established it;
- all functions called within that condition-case have already been exited, and
- the handler cannot return to them.
-
- If no applicable handler is in effect in your program, the current command is
- terminated and control returns to the editor command loop, because the command
- loop has an implicit handler for all kinds of errors. The command loop's
- handler uses the error symbol and associated data to print an error message.
-
- When an error is not handled explicitly, it may cause the Lisp debugger to be
- called. The debugger is enabled if the variable debug-on-error (see Error
- Debugging) is non-nil. Unlike error handlers, the debugger runs in the
- environment of the error, so that you can examine values of variables precisely
- as they were at the time of the error.
-
-
- ΓòÉΓòÉΓòÉ 12.5.3.3. Writing Code to Handle Errors ΓòÉΓòÉΓòÉ
-
- The usual effect of signaling an error is to terminate the command that is
- running and return immediately to the Emacs editor command loop. You can
- arrange to trap errors occurring in a part of your program by establishing an
- error handler with the special form condition-case. A simple example looks
- like this:
-
- (condition-case nil
- (delete-file filename)
- (error nil))
-
- This deletes the file named filename, catching any error and returning nil if
- an error occurs.
-
- The second argument of condition-case is called the protected form. (In the
- example above, the protected form is a call to delete-file.) The error
- handlers go into effect when this form begins execution and are deactivated
- when this form returns. They remain in effect for all the intervening time. In
- particular, they are in effect during the execution of subroutines called by
- this form, and their subroutines, and so on. This is a good thing, since,
- strictly speaking, errors can be signaled only by Lisp primitives (including
- signal and error) called by the protected form, not by the protected form
- itself.
-
- The arguments after the protected form are handlers. Each handler lists one
- or more condition names (which are symbols) to specify which errors it will
- handle. The error symbol specified when an error is signaled also defines a
- list of condition names. A handler applies to an error if they have any
- condition names in common. In the example above, there is one handler, and it
- specifies one condition name, error, which covers all errors.
-
- The search for an applicable handler checks all the established handlers
- starting with the most recently established one. Thus, if two nested
- condition-case forms try to handle the same error, the inner of the two will
- actually handle it.
-
- When an error is handled, control returns to the handler, unbinding all
- variable bindings made by binding constructs that are exited and executing the
- cleanups of all unwind-protect forms that are exited by doing so. Then the
- body of the handler is executed. After this, execution continues by returning
- from the condition-case form. Because the protected form is exited completely
- before execution of the handler, the handler cannot resume execution at the
- point of the error, nor can it examine variable bindings that were made within
- the protected form. All it can do is clean up and proceed.
-
- Error signaling and handling have some resemblance to throw and catch, but
- they are entirely separate facilities. An error cannot be caught by a catch,
- and a throw cannot be handled by an error handler (though if there is no catch,
- throw will signal an error which can be handled).
-
- -- Special Form: condition-case var protected-form handlers...
- This special form establishes the error handlers handlers around the execution
- of protected-form. If protected-form executes without error, the value it
- returns becomes the value of the condition-case form; in this case, the
- condition-case has no effect. The condition-case form makes a difference when
- an error occurs during protected-form.
-
- Each of the handlers is a list of the form (conditions body...). conditions is
- a condition name to be handled, or a list of condition names; body is one or
- more Lisp expressions to be executed when this handler handles an error.
-
- Each error that occurs has an error symbol which describes what kind of error
- it is. The error-conditions property of this symbol is a list of condition
- names (see Error Names). Emacs searches all the active condition-case forms
- for a handler which specifies one or more of these names; the innermost
- matching condition-case handles the error. The handlers in this condition-case
- are tested in the order in which they appear.
-
- The body of the handler is then executed, and the condition-case returns
- normally, using the value of the last form in the body as the overall value.
-
- The argument var is a variable. condition-case does not bind this variable
- when executing the protected-form, only when it handles an error. At that
- time, var is bound locally to a list of the form (error-symbol . data), giving
- the particulars of the error. The handler can refer to this list to decide
- what to do. For example, if the error is for failure opening a file, the file
- name is the second element of data---the third element of var.
-
- If var is nil, that means no variable is bound. Then the error symbol and
- associated data are not made available to the handler.
-
- Here is an example of using condition-case to handle the error that results
- from dividing by zero. The handler prints out a warning message and returns a
- very large number.
-
- (defun safe-divide (dividend divisor)
- (condition-case err
- ;; Protected form.
- (/ dividend divisor)
- ;; The handler.
- (arith-error ; Condition.
- (princ (format "Arithmetic error: %s" err))
- 1000000)))
- => safe-divide
-
- (safe-divide 5 0)
- -| Arithmetic error: (arith-error)
- => 1000000
-
- The handler specifies condition name arith-error so that it will handle only
- division-by-zero errors. Other kinds of errors will not be handled, at least
- not by this condition-case. Thus,
-
- (safe-divide nil 3)
- error--> Wrong type argument: integer-or-marker-p, nil
-
- Here is a condition-case that catches all kinds of errors, including those
- signaled with error:
-
- (setq baz 34)
- => 34
-
- (condition-case err
- (if (eq baz 35)
- t
- ;; This is a call to the function error.
- (error "Rats! The variable %s was %s, not 35." 'baz baz))
- ;; This is the handler; it is not a form.
- (error (princ (format "The error was: %s" err))
- 2))
-
- -| The error was: (error "Rats! The variable baz was 34, not 35.")
- => 2
-
- condition-case is often used to trap errors that are predictable, such as
- failure to open a file in a call to insert-file-contents. It is also used to
- trap errors that are totally unpredictable, such as when the program evaluates
- an expression read from the user.
-
-
- ΓòÉΓòÉΓòÉ 12.5.3.4. Error Symbols and Condition Names ΓòÉΓòÉΓòÉ
-
- When you signal an error, you specify an error symbol to specify the kind of
- error you have in mind. Each error has one and only one error symbol to
- categorize it. This is the finest classification of errors defined by the Lisp
- language.
-
- These narrow classifications are grouped into a hierarchy of wider classes
- called error conditions, identified by condition names. The narrowest such
- classes belong to the error symbols themselves: each error symbol is also a
- condition name. There are also condition names for more extensive classes, up
- to the condition name error which takes in all kinds of errors. Thus, each
- error has one or more condition names: error, the error symbol if that is
- distinct from error, and perhaps some intermediate classifications.
-
- In order for a symbol to be usable as an error symbol, it must have an
- error-conditions property which gives a list of condition names. This list
- defines the conditions which this kind of error belongs to. (The error symbol
- itself, and the symbol error, should always be members of this list.) Thus,
- the hierarchy of condition names is defined by the error-conditions properties
- of the error symbols.
-
- In addition to the error-conditions list, the error symbol should have an
- error-message property whose value is a string to be printed when that error is
- signaled but not handled. If the error-message property exists, but is not a
- string, the error message `peculiar error' is used.
-
- Here is how we define a new error symbol, new-error:
-
- (put 'new-error 'error-conditions '(error my-own-errors new-error))
- => (error my-own-errors new-error)
- (put 'new-error 'error-message "A new error")
- => "A new error"
-
- This error has three condition names: new-error, the narrowest classification;
- my-own-errors, which we imagine is a wider classification; and error, which is
- the widest of all.
-
- Naturally, Emacs will never signal a new-error on its own; only an explicit
- call to signal (see Errors) in your code can do this:
-
- (signal 'new-error '(x y))
- error--> A new error: x, y
-
- This error can be handled through any of the three condition names. This
- example handles new-error and any other errors in the class my-own-errors:
-
- (condition-case foo
- (bar nil t)
- (my-own-errors nil))
-
- The significant way that errors are classified is by their condition
- names---the names used to match errors with handlers. An error symbol serves
- only as a convenient way to specify the intended error message and list of
- condition names. If signal were given a list of condition names rather than
- one error symbol, that would be cumbersome.
-
- By contrast, using only error symbols without condition names would seriously
- decrease the power of condition-case. Condition names make it possible to
- categorize errors at various levels of generality when you write an error
- handler. Using error symbols alone would eliminate all but the narrowest level
- of classification.
-
- See Standard Errors, for a list of all the standard error symbols and their
- conditions.
-
-
- ΓòÉΓòÉΓòÉ 12.5.4. Cleaning up from Nonlocal Exits ΓòÉΓòÉΓòÉ
-
- The unwind-protect construct is essential whenever you temporarily put a data
- structure in an inconsistent state; it permits you to ensure the data are
- consistent in the event of an error.
-
- -- Special Form: unwind-protect body cleanup-forms...
- unwind-protect executes the body with a guarantee that the cleanup-forms will
- be evaluated if control leaves body, no matter how that happens. The body may
- complete normally, or execute a throw out of the unwind-protect, or cause an
- error; in all cases, the cleanup-forms will be evaluated.
-
- Only the body is actually protected by the unwind-protect. If any of the
- cleanup-forms themselves exit nonlocally (e.g., via a throw or an error), it is
- not guaranteed that the rest of them will be executed. If the failure of one
- of the cleanup-forms has the potential to cause trouble, then it should be
- protected by another unwind-protect around that form.
-
- The number of currently active unwind-protect forms counts, together with the
- number of local variable bindings, against the limit max-specpdl-size (see
- Local Variables).
-
- For example, here we make an invisible buffer for temporary use, and make sure
- to kill it before finishing:
-
- (save-excursion
- (let ((buffer (get-buffer-create " *temp*")))
- (set-buffer buffer)
- (unwind-protect
- body
- (kill-buffer buffer))))
-
- You might think that we could just as well write (kill-buffer (current-buffer))
- and dispense with the variable buffer. However, the way shown above is safer,
- if body happens to get an error after switching to a different buffer!
- (Alternatively, you could write another save-excursion around the body, to
- ensure that the temporary buffer becomes current in time to kill it.)
-
- Here is an actual example taken from the file `ftp.el'. It creates a process
- (see Processes) to try to establish a connection to a remote machine. As the
- function ftp-login is highly susceptible to numerous problems which the writer
- of the function cannot anticipate, it is protected with a form that guarantees
- deletion of the process in the event of failure. Otherwise, Emacs might fill
- up with useless subprocesses.
-
- (let ((win nil))
- (unwind-protect
- (progn
- (setq process (ftp-setup-buffer host file))
- (if (setq win (ftp-login process host user password))
- (message "Logged in")
- (error "Ftp login failed")))
- (or win (and process (delete-process process)))))
-
- This example actually has a small bug: if the user types C-g to quit, and the
- quit happens immediately after the function ftp-setup-buffer returns but before
- the variable process is set, the process will not be killed. There is no easy
- way to fix this bug, but at least it is very unlikely.
-
-
- ΓòÉΓòÉΓòÉ 13. Variables ΓòÉΓòÉΓòÉ
-
- A variable is a name used in a program to stand for a value. Nearly all
- programming languages have variables of some sort. In the text for a Lisp
- program, variables are written using the syntax for symbols.
-
- In Lisp, unlike most programming languages, programs are represented primarily
- as Lisp objects and only secondarily as text. The Lisp objects used for
- variables are symbols: the symbol name is the variable name, and the variable's
- value is stored in the value cell of the symbol. The use of a symbol as a
- variable is independent of whether the same symbol has a function definition.
- See Symbol Components.
-
- The textual form of a program is determined by its Lisp object representation;
- it is the read syntax for the Lisp object which constitutes the program. This
- is why a variable in a textual Lisp program is written as the read syntax for
- the symbol that represents the variable.
-
-
- ΓòÉΓòÉΓòÉ 13.1. Global Variables ΓòÉΓòÉΓòÉ
-
- The simplest way to use a variable is globally. This means that the variable
- has just one value at a time, and this value is in effect (at least for the
- moment) throughout the Lisp system. The value remains in effect until you
- specify a new one. When a new value replaces the old one, no trace of the old
- value remains in the variable.
-
- You specify a value for a symbol with setq. For example,
-
- (setq x '(a b))
-
- gives the variable x the value (a b). Note that the first argument of setq,
- the name of the variable, is not evaluated, but the second argument, the
- desired value, is evaluated normally.
-
- Once the variable has a value, you can refer to it by using the symbol by
- itself as an expression. Thus,
-
- x
- => (a b)
-
- assuming the setq form shown above has already been executed.
-
- If you do another setq, the new value replaces the old one:
-
- x
- => (a b)
- (setq x 4)
- => 4
- x
- => 4
-
-
- ΓòÉΓòÉΓòÉ 13.2. Variables that Never Change ΓòÉΓòÉΓòÉ
-
- Emacs Lisp has two special symbols, nil and t, that always evaluate to
- themselves. These symbols cannot be rebound, nor can their value cells be
- changed. An attempt to change the value of nil or t signals a setting-constant
- error.
-
- nil == 'nil
- => nil
- (setq nil 500)
- error--> Attempt to set constant symbol: nil
-
-
- ΓòÉΓòÉΓòÉ 13.3. Local Variables ΓòÉΓòÉΓòÉ
-
- Global variables are given values that last until explicitly superseded with
- new values. Sometimes it is useful to create variable values that exist
- temporarily---only while within a certain part of the program. These values
- are called local, and the variables so used are called local variables.
-
- For example, when a function is called, its argument variables receive new
- local values which last until the function exits. Similarly, the let special
- form explicitly establishes new local values for specified variables; these
- last until exit from the let form.
-
- When a local value is established, the previous value (or lack of one) of the
- variable is saved away. When the life span of the local value is over, the
- previous value is restored. In the mean time, we say that the previous value
- is shadowed and not visible. Both global and local values may be shadowed.
-
- If you set a variable (such as with setq) while it is local, this replaces the
- local value; it does not alter the global value, or previous local values that
- are shadowed. To model this behavior, we speak of a local binding of the
- variable as well as a local value.
-
- The local binding is a conceptual place that holds a local value. Entry to a
- function, or a special form such as let, creates the local binding; exit from
- the function or from the let removes the local binding. As long as the local
- binding lasts, the variable's value is stored within it. Use of setq or set
- while there is a local binding stores a different value into the local binding;
- it does not create a new binding.
-
- We also speak of the global binding, which is where (conceptually) the global
- value is kept.
-
- A variable can have more than one local binding at a time (for example, if
- there are nested let forms that bind it). In such a case, the most recently
- created local binding that still exists is the current binding of the variable.
- (This is called dynamic scoping; see Variable Scoping.) If there are no local
- bindings, the variable's global binding is its current binding. We also call
- the current binding the most-local existing binding, for emphasis. Ordinary
- evaluation of a symbol always returns the value of its current binding.
-
- The special forms let and let* exist to create local bindings.
-
- -- Special Form: let (bindings...) forms...
- This function binds variables according to bindings and then evaluates all of
- the forms in textual order. The let-form returns the value of the last form in
- forms.
-
- Each of the bindings is either (i) a symbol, in which case that symbol is bound
- to nil; or (ii) a list of the form (symbol value-form), in which case symbol is
- bound to the result of evaluating value-form. If value-form is omitted, nil is
- used.
-
- All of the value-forms in bindings are evaluated in the order they appear and
- before any of the symbols are bound. Here is an example of this: Z is bound to
- the old value of Y, which is 2, not the new value, 1.
-
- (setq Y 2)
- => 2
- (let ((Y 1)
- (Z Y))
- (list Y Z))
- => (1 2)
-
- -- Special Form: let* (bindings...) forms...
- This special form is like let, except that each symbol in bindings is bound as
- soon as its new value is computed, before the computation of the values of the
- following local bindings. Therefore, an expression in bindings may reasonably
- refer to the preceding symbols bound in this let* form. Compare the following
- example with the example above for let.
-
- (setq Y 2)
- => 2
- (let* ((Y 1)
- (Z Y)) ; Use the just-established value of Y.
- (list Y Z))
- => (1 1)
-
- Here is a complete list of the other facilities which create local bindings:
-
- o Function calls (see Functions).
-
- o Macro calls (see Macros).
-
- o condition-case (see Errors).
-
- -- Variable: max-specpdl-size
- This variable defines the limit on the number of local variable bindings and
- unwind-protect cleanups (see Nonlocal Exits) that are allowed before signaling
- an error (with data "Variable binding depth exceeds max-specpdl-size").
-
- This limit, with the associated error when it is exceeded, is one way that
- Lisp avoids infinite recursion on an ill-defined function.
-
- The default value is 600.
-
-
- ΓòÉΓòÉΓòÉ 13.4. When a Variable is ``Void'' ΓòÉΓòÉΓòÉ
-
- If you have never given a symbol any value as a global variable, we say that
- that symbol's global value is void. In other words, the symbol's value cell
- does not have any Lisp object in it. If you try to evaluate the symbol, you
- get a void-variable error rather than a value.
-
- Note that a value of nil is not the same as void. The symbol nil is a Lisp
- object and can be the value of a variable just as any other object can be; but
- it is a value. A void variable does not have any value.
-
- After you have given a variable a value, you can make it void once more using
- makunbound.
-
- -- Function: makunbound symbol
- This function makes the current binding of symbol void. This causes any future
- attempt to use this symbol as a variable to signal the error void-variable,
- unless or until you set it again.
-
- makunbound returns symbol.
-
- (makunbound 'x) ; Make the global value of x void.
- => x
- x
- error--> Symbol's value as variable is void: x
-
- If symbol is locally bound, makunbound affects the most local existing binding.
- This is the only way a symbol can have a void local binding, since all the
- constructs that create local bindings create them with values. In this case,
- the voidness lasts at most as long as the binding does; when the binding is
- removed due to exit from the construct that made it, the previous or global
- binding is reexposed as usual, and the variable is no longer void unless the
- newly reexposed binding was void all along.
-
- (setq x 1) ; Put a value in the global binding.
- => 1
- (let ((x 2)) ; Locally bind it.
- (makunbound 'x) ; Void the local binding.
- x)
- error--> Symbol's value as variable is void: x
- x ; The global binding is unchanged.
- => 1
-
- (let ((x 2)) ; Locally bind it.
- (let ((x 3)) ; And again.
- (makunbound 'x) ; Void the innermost-local binding.
- x)) ; And refer: it's void.
- error--> Symbol's value as variable is void: x
-
- (let ((x 2))
- (let ((x 3))
- (makunbound 'x)) ; Void inner binding, then remove it.
- x) ; Now outer let binding is visible.
- => 2
-
- A variable that has been made void with makunbound is indistinguishable from
- one that has never received a value and has always been void.
-
- You can use the function boundp to test whether a variable is currently void.
-
- -- Function: boundp variable
- boundp returns t if variable (a symbol) is not void; more precisely, if its
- current binding is not void. It returns nil otherwise.
-
- (boundp 'abracadabra) ; Starts out void.
- => nil
- (let ((abracadabra 5)) ; Locally bind it.
- (boundp 'abracadabra))
- => t
- (boundp 'abracadabra) ; Still globally void.
- => nil
- (setq abracadabra 5) ; Make it globally nonvoid.
- => 5
- (boundp 'abracadabra)
- => t
-
-
- ΓòÉΓòÉΓòÉ 13.5. Defining Global Variables ΓòÉΓòÉΓòÉ
-
- You may announce your intention to use a symbol as a global variable with a
- definition, using defconst or defvar.
-
- In Emacs Lisp, definitions serve three purposes. First, they inform the user
- who reads the code that certain symbols are intended to be used as variables.
- Second, they inform the Lisp system of these things, supplying a value and
- documentation. Third, they provide information to utilities such as etags and
- make-docfile, which create data bases of the functions and variables in a
- program.
-
- The difference between defconst and defvar is primarily a matter of intent,
- serving to inform human readers of whether programs will change the variable.
- Emacs Lisp does not restrict the ways in which a variable can be used based on
- defconst or defvar declarations. However, it also makes a difference for
- initialization: defconst unconditionally initializes the variable, while defvar
- initializes it only if it is void.
-
- One would expect user option variables to be defined with defconst, since
- programs do not change them. Unfortunately, this has bad results if the
- definition is in a library that is not preloaded: defconst would override any
- prior value when the library is loaded. Users would like to be able to set the
- option in their init files, and override the default value given in the
- definition. For this reason, user options must be defined with defvar.
-
- -- Special Form: defvar symbol [value [doc-string]]
- This special form informs a person reading your code that symbol will be used
- as a variable that the programs are likely to set or change. It is also used
- for all user option variables except in the preloaded parts of Emacs. Note
- that symbol is not evaluated; the symbol to be defined must appear explicitly
- in the defvar.
-
- If symbol already has a value (i.e., it is not void), value is not even
- evaluated, and symbol's value remains unchanged. If symbol is void and value
- is specified, it is evaluated and symbol is set to the result. (If value is
- not specified, the value of symbol is not changed in any case.)
-
- If the doc-string argument appears, it specifies the documentation for the
- variable. (This opportunity to specify documentation is one of the main
- benefits of defining the variable.) The documentation is stored in the
- symbol's variable-documentation property. The Emacs help functions (see
- Documentation) look for this property.
-
- If the first character of doc-string is `*', it means that this variable is
- considered to be a user option. This affects commands such as set-variable and
- edit-options.
-
- For example, this form defines foo but does not set its value:
-
- (defvar foo)
- => foo
-
- The following example sets the value of bar to 23, and gives it a documentation
- string:
-
- (defvar bar 23 "The normal weight of a bar.")
- => bar
-
- The following form changes the documentation string for bar, making it a user
- option, but does not change the value, since bar already has a value. (The
- addition (1+ 23) is not even performed.)
-
- (defvar bar (1+ 23) "*The normal weight of a bar.")
- => bar
- bar
- => 23
-
- Here is an equivalent expression for the defvar special form:
-
- (defvar symbol value doc-string)
- ==
- (progn
- (if (not (boundp 'symbol))
- (setq symbol value))
- (put 'symbol 'variable-documentation 'doc-string)
- 'symbol)
-
- The defvar form returns symbol, but it is normally used at top level in a file
- where its value does not matter.
-
- -- Special Form: defconst symbol [value [doc-string]]
- This special form informs a person reading your code that symbol has a global
- value, established here, that will not normally be changed or locally bound by
- the execution of the program. The user, however, may be welcome to change it.
- Note that symbol is not evaluated; the symbol to be defined must appear
- explicitly in the defconst.
-
- defconst always evaluates value and sets the global value of symbol to the
- result, provided value is given.
-
- *Note:* don't use defconst for user option variables in libraries that are not
- normally loaded. The user should be able to specify a value for such a
- variable in the `.emacs' file, so that it will be in effect if and when the
- library is loaded later.
-
- Here, pi is a constant that presumably ought not to be changed by anyone
- (attempts by the Indiana State Legislature notwithstanding). As the second form
- illustrates, however, this is only advisory.
-
- (defconst pi 3 "Pi to one place.")
- => pi
- (setq pi 4)
- => pi
- pi
- => 4
-
- -- Function: user-variable-p variable
- This function returns t if variable is a user option, intended to be set by the
- user for customization, nil otherwise. (Variables other than user options exist
- for the internal purposes of Lisp programs, and users need not know about
- them.)
-
- User option variables are distinguished from other variables by the first
- character of the variable-documentation property. If the property exists and
- is a string, and its first character is `*', then the variable is a user
- option.
-
- Note that if the defconst and defvar special forms are used while the variable
- has a local binding, the local binding's value is set, and the global binding
- is not changed. This would be confusing. But the normal way to use these
- special forms is at top level in a file, where no local binding should be in
- effect.
-
-
- ΓòÉΓòÉΓòÉ 13.6. Accessing Variable Values ΓòÉΓòÉΓòÉ
-
- The usual way to reference a variable is to write the symbol which names it
- (see Symbol Forms). This requires you to specify the variable name when you
- write the program. Usually that is exactly what you want to do. Occasionally
- you need to choose at run time which variable to reference; then you can use
- symbol-value.
-
- -- Function: symbol-value symbol
- This function returns the value of symbol. This is the value in the innermost
- local binding of the symbol, or its global value if it has no local bindings.
-
- (setq abracadabra 5)
- => 5
- (setq foo 9)
- => 9
-
- ;; Here the symbol abracadabra
- ;; is the symbol whose value is examined.
- (let ((abracadabra 'foo))
- (symbol-value 'abracadabra))
- => foo
-
- ;; Here the value of abracadabra,
- ;; which is foo,
- ;; is the symbol whose value is examined.
- (let ((abracadabra 'foo))
- (symbol-value abracadabra))
- => 9
-
- (symbol-value 'abracadabra)
- => 5
-
- A void-variable error is signaled if symbol has neither a local binding nor a
- global value.
-
-
- ΓòÉΓòÉΓòÉ 13.7. How to Alter a Variable Value ΓòÉΓòÉΓòÉ
-
- The usual way to change the value of a variable is with the special form setq.
- When you need to compute the choice of variable at run time, use the function
- set.
-
- -- Special Form: setq [symbol form]...
- This special form is the most common method of changing a variable's value.
- Each symbol is given a new value, which is the result of evaluating the
- corresponding form. The most-local existing binding of the symbol is changed.
-
- The value of the setq form is the value of the last form.
-
- (setq x (1+ 2))
- => 3
- x ; x now has a global value.
- => 3
- (let ((x 5))
- (setq x 6) ; The local binding of x is set.
- x)
- => 6
- x ; The global value is unchanged.
- => 3
-
- Note that the first form is evaluated, then the first symbol is set, then the
- second form is evaluated, then the second symbol is set, and so on:
-
- (setq x 10 ; Notice that x is set
- y (1+ x)) ; before the value of y is computed.
- => 11
-
- -- Function: set symbol value
- This function sets symbol's value to value, then returns value. Since set is a
- function, the expression written for symbol is evaluated to obtain the symbol
- to be set.
-
- The most-local existing binding of the variable is the binding that is set;
- shadowed bindings are not affected. If symbol is not actually a symbol, a
- wrong-type-argument error is signaled.
-
- (set one 1)
- error--> Symbol's value as variable is void: one
- (set 'one 1)
- => 1
- (set 'two 'one)
- => one
- (set two 2) ; two evaluates to symbol one.
- => 2
- one ; So it is one that was set.
- => 2
- (let ((one 1)) ; This binding of one is set,
- (set 'one 3) ; not the global value.
- one)
- => 3
- one
- => 2
-
- Logically speaking, set is a more fundamental primitive that setq. Any use of
- setq can be trivially rewritten to use set; setq could even be defined as a
- macro, given the availability of set. However, set itself is rarely used;
- beginners hardly need to know about it. It is needed only when the choice of
- variable to be set is made at run time. For example, the command set-variable,
- which reads a variable name from the user and then sets the variable, needs to
- use set.
-
- Common Lisp note: in Common Lisp, set always changes the symbol's special
- value, ignoring any lexical bindings. In Emacs Lisp, all variables and all
- bindings are special, so set always affects the most local existing binding.
-
-
- ΓòÉΓòÉΓòÉ 13.8. Scoping Rules for Variable Bindings ΓòÉΓòÉΓòÉ
-
- A given symbol foo may have several local variable bindings, established at
- different places in the Lisp program, as well as a global binding. The most
- recently established binding takes precedence over the others.
-
- Local bindings in Emacs Lisp have indefinite scope and dynamic extent. Scope
- refers to where textually in the source code the binding can be accessed.
- Indefinite scope means that any part of the program can potentially access the
- variable binding. Extent refers to when, as the program is executing, the
- binding exists. Dynamic extent means that the binding lasts as long as the
- activation of the construct that established it.
-
- The combination of dynamic extent and indefinite scope is called dynamic
- scoping. By contrast, most programming languages use lexical scoping, in which
- references to a local variable must be textually within the function or block
- that binds the variable.
-
- Common Lisp note: variables declared ``special'' in Common Lisp are dynamically
- scoped like variables in Emacs Lisp.
-
-
- ΓòÉΓòÉΓòÉ 13.8.1. Scope ΓòÉΓòÉΓòÉ
-
- Emacs Lisp uses indefinite scope for local variable bindings. This means that
- any function anywhere in the program text might access a given binding of a
- variable. Consider the following function definitions:
-
- (defun binder (x) ; x is bound in binder.
- (foo 5)) ; foo is some other function.
-
- (defun user () ; x is used in user.
- (list x))
-
- In a lexically scoped language, the binding of x from binder would never be
- accessible in user, because user is not textually contained within the function
- binder. However, in dynamically scoped Emacs Lisp, user may or may not refer
- to the binding of x established in binder, depending on circumstances:
-
- o If we call user directly without calling binder at all, then whatever binding
- of x is found, it cannot come from binder.
-
- o If we define foo as follows and call binder, then the binding made in binder
- will be seen in user:
-
- (defun foo (lose)
- (user))
-
- o If we define foo as follows and call binder, then the binding made in binder
- will not be seen in user:
-
- (defun foo (x)
- (user))
-
- Here, when foo is called by binder, it binds x. (The binding in foo is said
- to shadow the one made in binder.) Therefore, user will access the x bound
- by foo instead of the one bound by binder.
-
-
- ΓòÉΓòÉΓòÉ 13.8.2. Extent ΓòÉΓòÉΓòÉ
-
- Extent refers to the time during program execution that a variable name is
- valid. In Emacs Lisp, a variable is valid only while the form that bound it is
- executing. This is called dynamic extent. ``Local'' or ``automatic''
- variables in most languages, including C and Pascal, have dynamic extent.
-
- One alternative to dynamic extent is indefinite extent. This means that a
- variable binding can live on past the exit from the form that made the binding.
- Common Lisp and Scheme, for example, support this, but Emacs Lisp does not.
-
- To illustrate this, the function below, make-add, returns a function that
- purports to add n to its own argument m. This would work in Common Lisp, but it
- does not work as intended in Emacs Lisp, because after the call to make-add
- exits, the variable n is no longer bound to the actual argument 2.
-
- (defun make-add (n)
- (function (lambda (m) (+ n m)))) ; Return a function.
- => make-add
- (fset 'add2 (make-add 2)) ; Define function add2 with (make-add 2).
- => (lambda (m) (+ n m))
- (add2 4) ; Try to add 2 to 4.
- error--> Symbol's value as variable is void: n
-
-
- ΓòÉΓòÉΓòÉ 13.8.3. Implementation of Dynamic Scoping ΓòÉΓòÉΓòÉ
-
- A simple sample implementation (which is not how Emacs Lisp actually works)
- may help you understand dynamic binding. This technique is called deep binding
- and was used in early Lisp systems.
-
- Suppose there is a stack of bindings: variable-value pairs. At entry to a
- function or to a let form, we can push bindings on the stack for the arguments
- or local variables created there. We can pop those bindings from the stack at
- exit from the binding construct.
-
- We can find the value of a variable by searching the stack from top to bottom
- for a binding for that variable; the value from that binding is the value of
- the variable. To set the variable, we search for the current binding, then
- store the new value into that binding.
-
- As you can see, a function's bindings remain in effect as long as it continues
- execution, even during its calls to other functions. That is why we say the
- extent of the binding is dynamic. And any other function can refer to the
- bindings, if it uses the same variables while the bindings are in effect. That
- is why we say the scope is indefinite.
-
- The actual implementation of variable scoping in GNU Emacs Lisp uses a
- technique called shallow binding. Each variable has a standard place in which
- its current value is always found---the value cell of the symbol.
-
- In shallow binding, setting the variable works by storing a value in the value
- cell. When a new local binding is created, the local value is stored in the
- value cell, and the old value (belonging to a previous binding) is pushed on a
- stack. When a binding is eliminated, the old value is popped off the stack and
- stored in the value cell.
-
- We use shallow binding because it has the same results as deep binding, but
- runs faster, since there is never a need to search for a binding.
-
-
- ΓòÉΓòÉΓòÉ 13.8.4. Proper Use of Dynamic Scoping ΓòÉΓòÉΓòÉ
-
- Binding a variable in one function and using it in another is a powerful
- technique, but if used without restraint, it can make programs hard to
- understand. There are two clean ways to use this technique:
-
- o Use or bind the variable only in a few related functions, written close
- together in one file. Such a variable is used for communication within one
- program.
-
- You should write comments to inform other programmers that they can see all
- uses of the variable before them, and to advise them not to add uses
- elsewhere.
-
- o Give the variable a well-defined, documented meaning, and make all
- appropriate functions refer to it (but not bind it or set it) wherever that
- meaning is relevant. For example, the variable case-fold-search is defined
- as ``non-nil means ignore case when searching''; various search and replace
- functions refer to it directly or through their subroutines, but do not bind
- or set it.
-
- Then you can bind the variable in other programs, knowing reliably what the
- effect will be.
-
-
- ΓòÉΓòÉΓòÉ 13.9. Buffer-Local Variables ΓòÉΓòÉΓòÉ
-
- Global and local variable bindings are found in most programming languages in
- one form or another. Emacs also supports another, unusual kind of variable
- binding: buffer-local bindings, which apply only to one buffer. Emacs Lisp is
- meant for programming editing commands, and having different values for a
- variable in different buffers is an important customization method.
-
-
- ΓòÉΓòÉΓòÉ 13.9.1. Introduction to Buffer-Local Variables ΓòÉΓòÉΓòÉ
-
- A buffer-local variable has a buffer-local binding associated with a
- particular buffer. The binding is in effect when that buffer is current;
- otherwise, it is not in effect. If you set the variable while a buffer-local
- binding is in effect, the new value goes in that binding, so the global binding
- is unchanged; this means that the change is visible in that buffer alone.
-
- A variable may have buffer-local bindings in some buffers but not in others.
- The global binding is shared by all the buffers that don't have their own
- bindings. Thus, if you set the variable in a buffer that does not have a
- buffer-local binding for it, the new value is visible in all buffers except
- those with buffer-local bindings. (Here we are assuming that there are no
- let-style local bindings to complicate the issue.)
-
- The most common use of buffer-local bindings is for major modes to change
- variables that control the behavior of commands. For example, C mode and Lisp
- mode both set the variable paragraph-start to specify that only blank lines
- separate paragraphs. They do this by making the variable buffer-local in the
- buffer that is being put into C mode or Lisp mode, and then setting it to the
- new value for that mode.
-
- The usual way to make a buffer-local binding is with make-local-variable,
- which is what major mode commands use. This affects just the current buffer;
- all other buffers (including those yet to be created) continue to share the
- global value.
-
- A more powerful operation is to mark the variable as automatically
- buffer-local by calling make-variable-buffer-local. You can think of this as
- making the variable local in all buffers, even those yet to be created. More
- precisely, the effect is that setting the variable automatically makes the
- variable local to the current buffer if it is not already so. All buffers
- start out by sharing the global value of the variable as usual, but any setq
- creates a buffer-local binding for the current buffer. The new value is stored
- in the buffer-local binding, leaving the (default) global binding untouched.
- The global value can no longer be changed with setq; you need to use
- setq-default to do that.
-
- When a variable has local values in one or more buffers, you can get Emacs
- very confused by binding the variable with let, changing to a different current
- buffer in which a different binding is in effect, and then exiting the let.
- The best way to preserve your sanity is to avoid such situations. If you use
- save-excursion around each piece of code that changes to a different current
- buffer, you will not have this problem. Here is an example of incorrect code:
-
- (setq foo 'b)
- (set-buffer "a")
- (make-local-variable 'foo)
- (setq foo 'a)
- (let ((foo 'temp))
- (set-buffer "b")
- ...)
- foo => 'a ; The old buffer-local value from buffer `a'
- ; is now the default value.
- (set-buffer "a")
- foo => 'temp ; The local value that should be gone
- ; is now the buffer-local value in buffer `a'.
-
- But save-excursion as shown here avoids the problem:
-
- (let ((foo 'temp))
- (save-excursion
- (set-buffer "b")
- ...))
-
- Local variables in a file you edit are also represented by buffer-local
- bindings for the buffer that holds the file within Emacs. See Auto Major Mode.
-
-
- ΓòÉΓòÉΓòÉ 13.9.2. Creating and Destroying Buffer-local Bindings ΓòÉΓòÉΓòÉ
-
- -- Command: make-local-variable symbol
- This function creates a buffer-local binding for symbol in the current buffer.
- Other buffers are not affected. The value returned is symbol.
-
- The buffer-local value of symbol starts out as the same value symbol previously
- had.
-
- ;; In buffer `b1':
- (setq foo 5) ; Affects all buffers.
- => 5
- (make-local-variable 'foo) ; Now it is local in `b1'.
- => foo
- foo ; That did not change the value.
- => 5
- (setq foo 6) ; Change the value in `b1'.
- => 6
- foo
- => 6
-
- ;; In buffer `b2', the value hasn't changed.
- (save-excursion
- (set-buffer "b2")
- foo)
- => 5
-
- -- Command: make-variable-buffer-local symbol
- This function marks symbol automatically buffer-local, so that any attempt to
- set it will make it local to the current buffer at the time.
-
- The value returned is symbol.
-
- -- Function: buffer-local-variables &optional buffer
- This function tells you what the buffer-local variables are in buffer buffer.
- It returns an association list ( see Association Lists) in which each
- association contains one buffer-local variable and its value. If buffer is
- omitted, the current buffer is used.
-
- (setq lcl (buffer-local-variables))
- => ((fill-column . 75)
- (case-fold-search . t)
- ...
- (mark-ring #<marker at 5454 in buffers.texi>)
- (require-final-newline . t))
-
- Note that storing new values into the cdrs of the elements in this list will
- not change the local values of the variables.
-
- -- Command: kill-local-variable symbol
- This function deletes the buffer-local binding (if any) for symbol in the
- current buffer. As a result, the global (default) binding of symbol becomes
- visible in this buffer. Usually this results in a change in the value of
- symbol, since the global value is usually different from the buffer-local value
- just eliminated.
-
- It is possible to kill the local binding of a variable that automatically
- becomes local when set. This causes the variable to show its global value in
- the current buffer. However, if you set the variable again, this will once
- again create a local value.
-
- kill-local-variable returns symbol.
-
- -- Function: kill-all-local-variables
- This function eliminates all the buffer-local variable bindings of the current
- buffer. As a result, the buffer will see the default values of all variables.
- This function also resets certain other information pertaining to the buffer:
- its local keymap is set to nil, its syntax table is set to the value of
- standard-syntax-table, and its abbrev table is set to the value of
- fundamental-mode-abbrev-table.
-
- Every major mode command begins by calling this function, which has the effect
- of switching to Fundamental mode and erasing most of the effects of the
- previous major mode.
-
- kill-all-local-variables returns nil.
-
-
- ΓòÉΓòÉΓòÉ 13.9.3. The Default Value of a Buffer-Local Variable ΓòÉΓòÉΓòÉ
-
- The global value of a variable with buffer-local bindings is also called the
- default value, because it is the value that is in effect except when
- specifically overridden.
-
- The functions default-value and setq-default allow you to access and change
- the default value regardless of whether the current buffer has a buffer-local
- binding. For example, you could use setq-default to change the default setting
- of paragraph-start for most buffers; and this would work even when you are in a
- C or Lisp mode buffer which has a buffer-local value for this variable.
-
- -- Function: default-value symbol
- This function returns symbol's default value. This is the value that is seen
- in buffers that do not have their own values for this variable. If symbol is
- not buffer-local, this is equivalent to symbol-value (see Accessing Variables).
-
- -- Special Form: setq-default symbol value
- This sets the default value of symbol to value. symbol is not evaluated, but
- value is. The value of the setq-default form is value.
-
- If a symbol is not buffer-local for the current buffer, and is not marked
- automatically buffer-local, this has the same effect as setq. If symbol is
- buffer-local for the current buffer, then this changes the value that other
- buffers will see (as long as they don't have a buffer-local value), but not the
- value that the current buffer sees.
-
- ;; In buffer `foo':
- (make-local-variable 'local)
- => local
- (setq local 'value-in-foo)
- => value-in-foo
- (setq-default local 'new-default)
- => new-default
- local
- => value-in-foo
- (default-value 'local)
- => new-default
-
- ;; In (the new) buffer `bar':
- local
- => new-default
- (default-value 'local)
- => new-default
- (setq local 'another-default)
- => another-default
- (default-value 'local)
- => another-default
-
- ;; Back in buffer `foo':
- local
- => value-in-foo
- (default-value 'local)
- => another-default
-
- -- Function: set-default symbol value
- This function is like setq-default, except that symbol is evaluated.
-
- (set-default (car '(a b c)) 23)
- => 23
- (default-value 'a)
- => 23
-
-
- ΓòÉΓòÉΓòÉ 14. Functions ΓòÉΓòÉΓòÉ
-
- A Lisp program is composed mainly of Lisp functions. This chapter explains
- what functions are, how they accept arguments, and how to define them.
-
-
- ΓòÉΓòÉΓòÉ 14.1. What Is a Function? ΓòÉΓòÉΓòÉ
-
- In a general sense, a function is a rule for carrying on a computation given
- several values called arguments. The result of the computation is called the
- value of the function. The computation can also have side effects: lasting
- changes in the values of variables or the contents of data structures.
-
- Here are important terms for functions in Emacs Lisp and for other
- function-like objects.
-
- function
- In Emacs Lisp, a function is anything that can be applied to
- arguments in a Lisp program. In some cases, we will use it more
- specifically to mean a function written in Lisp. Special forms and
- macros are not functions.
-
- primitive
- A primitive is a function callable from Lisp that is written in C,
- such as car or append. These functions are also called built-in
- functions or subrs. (Special forms are also considered primitives.)
-
- Primitives provide the lowest-level interfaces to editing functions
- or operating system services, or in a few cases they perform
- important operations more quickly than a Lisp program could.
- Primitives can be modified or added only by changing the C sources
- and recompiling the editor. See Writing Emacs Primitives.
-
- lambda expression
- A lambda expression is a function written in Lisp. These are
- described in the following section. See Lambda Expressions.
-
- special form
- A special form is a primitive that is like a function but does not
- evaluate all of its arguments in the usual way. It may evaluate only
- some of the arguments, or may evaluate them in an unusual order, or
- several times. Many special forms are described in Control
- Structures.
-
- macro
- A macro is a construct defined in Lisp by the programmer. It differs
- from a function in that it translates a Lisp expression that you
- write into an equivalent expression to be evaluated instead of the
- original expression. See Macros, for how to define and use macros.
-
- command
- A command is an object that command-execute can invoke; it is a
- possible definition for a key sequence. Some functions are commands;
- a function written in Lisp is a command if it contains an interactive
- declaration (see Defining Commands). Such a function can be called
- from Lisp expressions like other functions; in this case, the fact
- that the function is a command makes no difference.
-
- Strings are commands also, even though they are not functions. A
- symbol is a command if its function definition is a command; such
- symbols can be invoked with M-x. The symbol is a function as well if
- the definition is a function. See Command Overview.
-
- keystroke command
- A keystroke command is a command that is bound to a key sequence
- (typically one to three keystrokes). The distinction is made here
- merely to avoid confusion with the meaning of ``command'' in
- non-Emacs editors; for programmers, the distinction is normally
- unimportant.
-
- -- Function: subrp object
- This function returns t if object is a built-in function (i.e. a Lisp
- primitive).
-
- (subrp 'message) ; message is a symbol,
- => nil ; not a subr object.
- (subrp (symbol-function 'message))
- => t
-
-
- ΓòÉΓòÉΓòÉ 14.2. Lambda Expressions ΓòÉΓòÉΓòÉ
-
- A function written in Lisp is a list that looks like this:
-
- (lambda (arg-variables...)
- [documentation-string]
- [interactive-declaration]
- body-forms...)
-
- (Such a list is called a lambda expression, even though it is not an expression
- at all, for historical reasons.)
-
-
- ΓòÉΓòÉΓòÉ 14.2.1. Components of a Lambda Expression ΓòÉΓòÉΓòÉ
-
- A function written in Lisp (a ``lambda expression'') is a list that looks like
- this:
-
- (lambda (arg-variables...)
- [documentation-string]
- [interactive-declaration]
- body-forms...)
-
- The first element of a lambda expression is always the symbol lambda. This
- indicates that the list represents a function. The reason functions are
- defined to start with lambda is so that other lists, intended for other uses,
- will not accidentally be valid as functions.
-
- The second element is a list of argument variable names (symbols). This is
- called the lambda list. When a Lisp function is called, the argument values
- are matched up against the variables in the lambda list, which are given local
- bindings with the values provided. See Local Variables.
-
- The documentation string is an actual string that serves to describe the
- function for the Emacs help facilities. See Function Documentation.
-
- The interactive declaration is a list of the form (interactive code-string).
- This declares how to provide arguments if the function is used interactively.
- Functions with this declaration are called commands; they can be called using
- M-x or bound to a key. Functions not intended to be called in this way should
- not have interactive declarations. See Defining Commands, for how to write an
- interactive declaration.
-
- The rest of the elements are the body of the function: the Lisp code to do the
- work of the function (or, as a Lisp programmer would say, ``a list of Lisp
- forms to evaluate''). The value returned by the function is the value returned
- by the last element of the body.
-
-
- ΓòÉΓòÉΓòÉ 14.2.2. A Simple Lambda-Expression Example ΓòÉΓòÉΓòÉ
-
- Consider for example the following function:
-
- (lambda (a b c) (+ a b c))
-
- We can call this function by writing it as the car of an expression, like this:
-
- ((lambda (a b c) (+ a b c))
- 1 2 3)
-
- The body of this lambda expression is evaluated with the variable a bound to 1,
- b bound to 2, and c bound to 3. Evaluation of the body adds these three
- numbers, producing the result 6; therefore, this call to the function returns
- the value 6.
-
- Note that the arguments can be the results of other function calls, as in this
- example:
-
- ((lambda (a b c) (+ a b c))
- 1 (* 2 3) (- 5 4))
-
- Here all the arguments 1, (* 2 3), and (- 5 4) are evaluated, left to right.
- Then the lambda expression is applied to the argument values 1, 6 and 1 to
- produce the value 8.
-
- It is not often useful to write a lambda expression as the car of a form in
- this way. You can get the same result, of making local variables and giving
- them values, using the special form let (see Local Variables). And let is
- clearer and easier to use. In practice, lambda expressions are either stored as
- the function definitions of symbols, to produce named functions, or passed as
- arguments to other functions (see Anonymous Functions).
-
- However, calls to explicit lambda expressions were very useful in the old days
- of Lisp, before the special form let was invented. At that time, they were the
- only way to bind and initialize local variables.
-
-
- ΓòÉΓòÉΓòÉ 14.2.3. Advanced Features of Argument Lists ΓòÉΓòÉΓòÉ
-
- Our simple sample function, (lambda (a b c) (+ a b c)), specifies three
- argument variables, so it must be called with three arguments: if you try to
- call it with only two arguments or four arguments, you will get a
- wrong-number-of-arguments error.
-
- It is often convenient to write a function that allows certain arguments to be
- omitted. For example, the function substring accepts three arguments---a
- string, the start index and the end index---but the third argument defaults to
- the end of the string if you omit it. It is also convenient for certain
- functions to accept an indefinite number of arguments, as the functions and and
- + do.
-
- To specify optional arguments that may be omitted when a function is called,
- simply include the keyword &optional before the optional arguments. To specify
- a list of zero or more extra arguments, include the keyword &rest before one
- final argument.
-
- Thus, the complete syntax for an argument list is as follows:
-
- (required-vars...
- [&optional optional-vars...]
- [&rest rest-var])
-
- The square brackets indicate that the &optional and &rest clauses, and the
- variables that follow them, are optional.
-
- A call to the function requires one actual argument for each of the
- required-vars. There may be actual arguments for zero or more of the
- optional-vars, and there cannot be any more actual arguments than these unless
- &rest exists. In that case, there may be any number of extra actual arguments.
-
- If actual arguments for the optional and rest variables are omitted, then they
- always default to nil. However, the body of the function is free to consider
- nil an abbreviation for some other meaningful value. This is what substring
- does; nil as the third argument means to use the length of the string supplied.
- There is no way for the function to distinguish between an explicit argument of
- nil and an omitted argument.
-
- Common Lisp note: Common Lisp allows the function to specify what default
- values will be used when an optional argument is omitted; GNU Emacs Lisp always
- uses nil.
-
- For example, an argument list that looks like this:
-
- (a b &optional c d &rest e)
-
- binds a and b to the first two actual arguments, which are required. If one or
- two more arguments are provided, c and d are bound to them respectively; any
- arguments after the first four are collected into a list and e is bound to that
- list. If there are only two arguments, c is nil; if two or three arguments, d
- is nil; if four arguments or fewer, e is nil.
-
- There is no way to have required arguments following optional ones---it would
- not make sense. To see why this must be so, suppose that c in the example were
- optional and d were required. If three actual arguments are given; then which
- variable would the third argument be for? Similarly, it makes no sense to have
- any more arguments (either required or optional) after a &rest argument.
-
- Here are some examples of argument lists and proper calls:
-
- ((lambda (n) (1+ n)) ; One required:
- 1) ; requires exactly one argument.
- => 2
- ((lambda (n &optional n1) ; One required and one optional:
- (if n1 (+ n n1) (1+ n))) ; 1 or 2 arguments.
- 1 2)
- => 3
- ((lambda (n &rest ns) ; One required and one rest:
- (+ n (apply '+ ns))) ; 1 or more arguments.
- 1 2 3 4 5)
- => 15
-
-
- ΓòÉΓòÉΓòÉ 14.2.4. Documentation Strings of Functions ΓòÉΓòÉΓòÉ
-
- A lambda expression may optionally have a documentation string just after the
- lambda list. This string does not affect execution of the function; it is a
- kind of comment, but a systematized comment which actually appears inside the
- Lisp world and can be used by the Emacs help facilities. See Documentation,
- for how the documentation-string is accessed.
-
- It is a good idea to provide documentation strings for all commands, and for
- all other functions in your program that users of your program should know
- about; internal functions might as well have only comments, since comments
- don't take up any room when your program is loaded.
-
- The first line of the documentation string should stand on its own, because
- apropos displays just this first line. It should consist of one or two
- complete sentences that summarize the function's purpose.
-
- The start of the documentation string is usually indented, but since these
- spaces come before the starting double-quote, they are not part of the string.
- Some people make a practice of indenting any additional lines of the string so
- that the text lines up. This is a mistake. The indentation of the following
- lines is inside the string; what looks nice in the source code will look ugly
- when displayed by the help commands.
-
- You may wonder how the documentation string could be optional, since there are
- required components of the function that follow it (the body). Since evaluation
- of a string returns that string, without any side effects, it has no effect if
- it is not the last form in the body. Thus, in practice, there is no confusion
- between the first form of the body and the documentation string; if the only
- body form is a string then it serves both as the return value and as the
- documentation.
-
-
- ΓòÉΓòÉΓòÉ 14.3. Naming a Function ΓòÉΓòÉΓòÉ
-
- In most computer languages, every function has a name; the idea of a function
- without a name is nonsensical. In Lisp, a function in the strictest sense has
- no name. It is simply a list whose first element is lambda, or a primitive
- subr-object.
-
- However, a symbol can serve as the name of a function. This happens when you
- put the function in the symbol's function cell (see Symbol Components). Then
- the symbol itself becomes a valid, callable function, equivalent to the list or
- subr-object that its function cell refers to. The contents of the function
- cell are also called the symbol's function definition.
-
- In practice, nearly all functions are given names in this way and referred to
- through their names. For example, the symbol car works as a function and does
- what it does because the primitive subr-object #<subr car> is stored in its
- function cell.
-
- We give functions names because it is more convenient to refer to them by
- their names in other functions. For primitive subr-objects such as #<subr
- car>, names are the only way you can refer to them: there is no read syntax for
- such objects. For functions written in Lisp, the name is more convenient to
- use in a call than an explicit lambda expression. Also, a function with a name
- can refer to itself---it can be recursive. Writing the function's name in its
- own definition is much more convenient than making the function definition
- point to itself (something that is not impossible but that has various
- disadvantages in practice).
-
- Functions are often identified with the symbols used to name them. For
- example, we often speak of ``the function car'', not distinguishing between the
- symbol car and the primitive subr-object that is its function definition. For
- most purposes, there is no need to distinguish.
-
- Even so, keep in mind that a function need not have a unique name. While a
- given function object usually appears in the function cell of only one symbol,
- this is just a matter of convenience. It is very easy to store it in several
- symbols using fset; then each of the symbols is equally well a name for the
- same function.
-
- A symbol used as a function name may also be used as a variable; these two
- uses of a symbol are independent and do not conflict.
-
-
- ΓòÉΓòÉΓòÉ 14.4. Defining Named Functions ΓòÉΓòÉΓòÉ
-
- We usually give a name to a function when it is first created. This is called
- defining a function, and it is done with the defun special form.
-
- -- Special Form: defun name argument-list body-forms
- defun is the usual way to define new Lisp functions. It defines the symbol
- name as a function that looks like this:
-
- (lambda argument-list . body-forms)
-
- This lambda expression is stored in the function cell of name. The value
- returned by evaluating the defun form is name, but usually we ignore this
- value.
-
- As described previously (see Lambda Expressions), argument-list is a list of
- argument names and may include the keywords &optional and &rest. Also, the
- first two forms in body-forms may be a documentation string and an interactive
- declaration.
-
- Note that the same symbol name may also be used as a global variable, since the
- value cell is independent of the function cell.
-
- Here are some examples:
-
- (defun foo () 5)
- => foo
- (foo)
- => 5
-
- (defun bar (a &optional b &rest c)
- (list a b c))
- => bar
- (bar 1 2 3 4 5)
- => (1 2 (3 4 5))
- (bar 1)
- => (1 nil nil)
- (bar)
- error--> Wrong number of arguments.
-
- (defun capitalize-backwards ()
- "This function makes the last letter of a word upper case."
- (interactive)
- (backward-word 1)
- (forward-word 1)
- (backward-char 1)
- (capitalize-word 1))
- => capitalize-backwards
-
- Be careful not to redefine existing functions unintentionally. defun will
- redefine even primitive functions such as car without any hesitation or
- notification. Redefining a function already defined is often done
- deliberately, and there is no way to distinguish deliberate redefinition from
- unintentional redefinition.
-
-
- ΓòÉΓòÉΓòÉ 14.5. Calling Functions ΓòÉΓòÉΓòÉ
-
- Defining functions is only half the battle. Functions don't do anything until
- you call them, i.e., tell them to run. This process is also known as
- invocation.
-
- The most common way of invoking a function is by evaluating a list. For
- example, evaluating the list (concat "a" "b") calls the function concat. See
- Evaluation, for a description of evaluation.
-
- When you write a list as an expression in your program, the function name is
- part of the program. This means that the choice of which function to call is
- made when you write the program. Usually that's just what you want.
- Occasionally you need to decide at run time which function to call. Then you
- can use the functions funcall and apply.
-
- -- Function: funcall function &rest arguments
- funcall calls function with arguments, and returns whatever function returns.
-
- Since funcall is a function, all of its arguments, including function, are
- evaluated before funcall is called. This means that you can use any expression
- to obtain the function to be called. It also means that funcall does not see
- the expressions you write for the arguments, only their values. These values
- are not evaluated a second time in the act of calling function; funcall enters
- the normal procedure for calling a function at the place where the arguments
- have already been evaluated.
-
- The argument function must be either a Lisp function or a primitive function.
- Special forms and macros are not allowed, because they make sense only when
- given the ``unevaluated'' argument expressions. funcall cannot provide these
- because, as we saw above, it never knows them in the first place.
-
- (setq f 'list)
- => list
- (funcall f 'x 'y 'z)
- => (x y z)
- (funcall f 'x 'y '(z))
- => (x y (z))
- (funcall 'and t nil)
- error--> Invalid function: #<subr and>
-
- Compare this example with that of apply.
-
- -- Function: apply function &rest arguments
- apply calls function with arguments, just like funcall but with one difference:
- the last of arguments is a list of arguments to give to function, rather than a
- single argument. We also say that this list is appended to the other
- arguments.
-
- apply returns the result of calling function. As with funcall, function must
- either be a Lisp function or a primitive function; special forms and macros do
- not make sense in apply.
-
- (setq f 'list)
- => list
- (apply f 'x 'y 'z)
- error--> Wrong type argument: listp, z
- (apply '+ 1 2 '(3 4))
- => 10
- (apply '+ '(1 2 3 4))
- => 10
-
- (apply 'append '((a b c) nil (x y z) nil))
- => (a b c x y z)
-
- An interesting example of using apply is found in the description of mapcar;
- see the following section.
-
- It is common for Lisp functions to accept functions as arguments or find them
- in data structures (especially in hook variables and property lists) and call
- them using funcall or apply. Functions that accept function arguments are
- often called functionals.
-
- Sometimes, when you call such a function, it is useful to supply a no-op
- function as the argument. Here are two different kinds of no-op function:
-
- -- Function: identity arg
- This function returns arg and has no side effects.
-
- -- Function: ignore &rest args
- This function ignores any arguments and returns nil.
-
-
- ΓòÉΓòÉΓòÉ 14.6. Mapping Functions ΓòÉΓòÉΓòÉ
-
- A mapping function applies a given function to each element of a list or other
- collection. Emacs Lisp has three such functions; mapcar and mapconcat, which
- scan a list, are described here. For the third mapping function, mapatoms, see
- Creating Symbols.
-
- -- Function: mapcar function sequence
- mapcar applies function to each element of sequence in turn. The results are
- made into a nil-terminated list.
-
- The argument sequence may be a list, a vector or a string. The result is
- always a list. The length of the result is the same as the length of sequence.
-
- For example:
-
- (mapcar 'car '((a b) (c d) (e f)))
- => (a c e)
- (mapcar '1+ [1 2 3])
- => (2 3 4)
- (mapcar 'char-to-string "abc")
- => ("a" "b" "c")
-
- ;; Call each function in my-hooks.
- (mapcar 'funcall my-hooks)
-
- (defun mapcar* (f &rest args)
- "Apply FUNCTION to successive cars of all ARGS, until one ends.
- Return the list of results."
- (if (not (memq 'nil args)) ; If no list is exhausted,
- (cons (apply f (mapcar 'car args)) ; Apply function to CARs.
- (apply 'mapcar* f ; Recurse for rest of elements.
- (mapcar 'cdr args)))))
-
- (mapcar* 'cons '(a b c) '(1 2 3 4))
- => ((a . 1) (b . 2) (c . 3))
-
- -- Function: mapconcat function sequence separator
- mapconcat applies function to each element of sequence: the results, which must
- be strings, are concatenated. Between each pair of result strings, mapconcat
- inserts the string separator. Usually separator contains a space or comma or
- other suitable punctuation.
-
- The argument function must be a function that can take one argument and returns
- a string.
-
- (mapconcat 'symbol-name
- '(The cat in the hat)
- " ")
- => "The cat in the hat"
-
- (mapconcat (function (lambda (x) (format "%c" (1+ x))))
- "HAL-8000"
- "")
- => "IBM.9111"
-
-
- ΓòÉΓòÉΓòÉ 14.7. Anonymous Functions ΓòÉΓòÉΓòÉ
-
- In Lisp, a function is a list that starts with lambda (or alternatively a
- primitive subr-object); names are ``extra''. Although usually functions are
- defined with defun and given names at the same time, it is occasionally more
- concise to use an explicit lambda expression---an anonymous function. Such a
- list is valid wherever a function name is.
-
- Any method of creating such a list makes a valid function. Even this:
-
- (setq silly (append '(lambda (x)) (list (list '+ (* 3 4) 'x))))
- => (lambda (x) (+ 12 x))
-
- This computes a list that looks like (lambda (x) (+ 12 x)) and makes it the
- value (not the function definition!) of silly.
-
- Here is how we might call this function:
-
- (funcall silly 1)
- => 13
-
- (It does not work to write (silly 1), because this function is not the function
- definition of silly. We have not given silly any function definition, just a
- value as a variable.)
-
- Most of the time, anonymous functions are constants that appear in your
- program. For example, you might want to pass one as an argument to the
- function mapcar, which applies any given function to each element of a list.
- Here we pass an anonymous function that multiplies a number by two:
-
- (defun double-each (list)
- (mapcar '(lambda (x) (* 2 x)) list))
- => double-each
- (double-each '(2 11))
- => (4 22)
-
- In such cases, we usually use the special form function instead of simple
- quotation to quote the anonymous function.
-
- -- Special Form: function function-object
- This special form returns function-object without evaluating it. In this, it is
- equivalent to quote. However, it serves as a note to the Emacs Lisp compiler
- that function-object is intended to be used only as a function, and therefore
- can safely be compiled. See Quoting, for comparison.
-
- Using function instead of quote makes a difference inside a function or macro
- that you are going to compile. For example:
-
- (defun double-each (list)
- (mapcar (function (lambda (x) (* 2 x))) list))
- => double-each
- (double-each '(2 11))
- => (4 22)
-
- If this definition of double-each is compiled, the anonymous function is
- compiled as well. By contrast, in the previous definition where ordinary quote
- is used, the argument passed to mapcar is the precise list shown:
-
- (lambda (arg) (+ arg 5))
-
- The Lisp compiler cannot assume this list is a function, even though it looks
- like one, since it does not know what mapcar does with the list. Perhaps
- mapcar will check that the car of the third element is the symbol +! The
- advantage of function is that it tells the compiler to go ahead and compile the
- constant function.
-
- We sometimes write function instead of quote when quoting the name of a
- function, but this usage is just a sort of comment.
-
- (function symbol) == (quote symbol) == 'symbol
-
- See documentation in Accessing Documentation, for a realistic example using
- function and an anonymous function.
-
-
- ΓòÉΓòÉΓòÉ 14.8. Accessing Function Cell Contents ΓòÉΓòÉΓòÉ
-
- The function definition of a symbol is the object stored in the function cell
- of the symbol. The functions described here access, test, and set the function
- cell of symbols.
-
- -- Function: symbol-function symbol
- This returns the object in the function cell of symbol. If the symbol's
- function cell is void, a void-function error is signaled.
-
- This function does not check that the returned object is a legitimate function.
-
- (defun bar (n) (+ n 2))
- => bar
- (symbol-function 'bar)
- => (lambda (n) (+ n 2))
- (fset 'baz 'bar)
- => bar
- (symbol-function 'baz)
- => bar
-
- If you have never given a symbol any function definition, we say that that
- symbol's function cell is void. In other words, the function cell does not
- have any Lisp object in it. If you try to call such a symbol as a function, it
- signals a void-function error.
-
- Note that void is not the same as nil or the symbol void. The symbols nil and
- void are Lisp objects, and can be stored into a function cell just as any other
- object can be (and they can be valid functions if you define them in turn with
- defun); but nil or void is an object. A void function cell contains no object
- whatsoever.
-
- You can test the voidness of a symbol's function definition with fboundp.
- After you have given a symbol a function definition, you can make it void once
- more using fmakunbound.
-
- -- Function: fboundp symbol
- Returns t if the symbol has an object in its function cell, nil otherwise. It
- does not check that the object is a legitimate function.
-
- -- Function: fmakunbound symbol
- This function makes symbol's function cell void, so that a subsequent attempt
- to access this cell will cause a void-function error. (See also makunbound, in
- Local Variables.)
-
- (defun foo (x) x)
- => x
- (fmakunbound 'foo)
- => x
- (foo 1)
- error--> Symbol's function definition is void: foo
-
- -- Function: fset symbol object
- This function stores object in the function cell of symbol. The result is
- object. Normally object should be a function or the name of a function, but
- this is not checked.
-
- There are three normal uses of this function:
-
- o Copying one symbol's function definition to another. (In other words, making
- an alternate name for a function.)
-
- o Giving a symbol a function definition that is not a list and therefore cannot
- be made with defun. See Classifying Lists, for an example of this usage.
-
- o In constructs for defining or altering functions. If defun were not a
- primitive, it could be written in Lisp (as a macro) using fset.
-
- Here are examples of the first two uses:
-
- ;; Give first the same definition car has.
- (fset 'first (symbol-function 'car))
- => #<subr car>
- (first '(1 2 3))
- => 1
-
- ;; Make the symbol car the function definition of xfirst.
- (fset 'xfirst 'car)
- => car
- (xfirst '(1 2 3))
- => 1
- (symbol-function 'xfirst)
- => car
- (symbol-function (symbol-function 'xfirst))
- => #<subr car>
-
- ;; Define a named keyboard macro.
- (fset 'kill-two-lines "\^u2\^k")
- => "\^u2\^k"
-
- When writing a function that extends a previously defined function, the
- following idiom is often used:
-
- (fset 'old-foo (symbol-function 'foo))
-
- (defun foo ()
- "Just like old-foo, except more so."
- (old-foo)
- (more-so))
-
- This does not work properly if foo has been defined to autoload. In such a
- case, when foo calls old-foo, Lisp will attempt to define old-foo by loading a
- file. Since this presumably defines foo rather than old-foo, it will not
- produce the proper results. The only way to avoid this problem is to make sure
- the file is loaded before moving aside the old definition of foo.
-
-
- ΓòÉΓòÉΓòÉ 14.9. Other Topics Related to Functions ΓòÉΓòÉΓòÉ
-
- Here is a table of several functions that do things related to function
- calling and function definitions.
-
- apply
- See Calling Functions.
-
- autoload
- See Autoload.
-
- call-interactively
- See Interactive Call.
-
- commandp
- See Interactive Call.
-
- documentation
- See Accessing Documentation.
-
- eval
- See Eval.
-
- funcall
- See Calling Functions.
-
- ignore
- See Calling Functions.
-
- interactive
- See Using Interactive.
-
- interactive-p
- See Interactive Call.
-
- mapatoms
- See Creating Symbols.
-
- mapcar
- See Mapping Functions.
-
- mapconcat
- See Mapping Functions.
-
- undefined
- See Key Lookup.
-
-
- ΓòÉΓòÉΓòÉ 15. Macros ΓòÉΓòÉΓòÉ
-
- Macros enable you to define new control constructs and other language
- features. A macro is defined much like a function, but instead of telling how
- to compute a value, it tells how to compute another Lisp expression which will
- in turn compute the value. We call this expression the expansion of the macro.
-
- Macros can do this because they operate on the unevaluated expressions for the
- arguments, not on the argument values as functions do. They can therefore
- construct an expansion containing these argument expressions or parts of them.
-
-
- ΓòÉΓòÉΓòÉ 15.1. A Simple Example of a Macro ΓòÉΓòÉΓòÉ
-
- Suppose we would like to define a Lisp construct to increment a variable
- value, much like the ++ operator in C. We would like to write (inc x) and have
- the effect of (setq x (1+ x)). Here's a macro definition that will do the job:
-
- (defmacro inc (var)
- (list 'setq var (list '1+ var)))
-
- When this is called with (inc x), the argument var has the value x---not the
- value of x. The body of the macro uses this to construct the expansion, which
- is (setq x (1+ x)). Once the macro definition returns this expansion, Lisp
- proceeds to evaluate it, thus incrementing x.
-
-
- ΓòÉΓòÉΓòÉ 15.2. Expansion of a Macro Call ΓòÉΓòÉΓòÉ
-
- A macro call looks just like a function call in that it is a list which starts
- with the name of the macro. The rest of the elements of the list are the
- arguments of the macro.
-
- Evaluation of the macro call begins like evaluation of a function call except
- for one crucial difference: the macro arguments are the actual expressions
- appearing in the macro call. They are not evaluated before they are given to
- the macro definition. By contrast, the arguments of a function are results of
- evaluating the elements of the function call list.
-
- Having obtained the arguments, Lisp invokes the macro definition just as a
- function is invoked. The argument variables of the macro are bound to the
- argument values from the macro call, or to a list of them in the case of a
- &rest argument. And the macro body executes and returns its value just as a
- function body does.
-
- The second crucial difference between macros and functions is that the value
- returned by the macro body is not the value of the macro call. Instead, it is
- an alternate expression for computing that value, also known as the expansion
- of the macro. The Lisp interpreter proceeds to evaluate the expansion as soon
- as it comes back from the macro.
-
- Since the expansion is evaluated in the normal manner, it may contain calls to
- other macros. It may even be a call to the same macro, though this is unusual.
-
- You can see the expansion of a given macro call by calling macroexpand:
-
- -- Function: macroexpand form &optional environment
- This function expands form, if it is a macro call. If the result is another
- macro call, it is expanded in turn, until something which is not a macro call
- results. That is the value returned by macroexpand. If form is not a macro
- call to begin with, it is returned as given.
-
- Note that macroexpand does not look at the subexpressions of form (although
- some macro definitions may do so). If they are macro calls themselves,
- macroexpand will not expand them.
-
- If environment is provided, it specifies an alist of macro definitions that
- shadow the currently defined macros. This is used by byte compilation.
-
- (defmacro inc (var)
- (list 'setq var (list '1+ var)))
- => inc
-
- (macroexpand '(inc r))
- => (setq r (1+ r))
-
- (defmacro inc2 (var1 var2)
- (list 'progn (list 'inc var1) (list 'inc var2)))
- => inc2
-
- (macroexpand '(inc2 r s))
- => (progn (inc r) (inc s)) ; inc not expanded here.
-
-
- ΓòÉΓòÉΓòÉ 15.3. Macros and Byte Compilation ΓòÉΓòÉΓòÉ
-
- You might ask why we take the trouble to compute an expansion for a macro and
- then evaluate the expansion. Why not have the macro body produce the desired
- results directly? The reason has to do with compilation.
-
- When a macro call appears in a Lisp program being compiled, the Lisp compiler
- calls the macro definition just as the interpreter would, and receives an
- expansion. But instead of evaluating this expansion, it compiles expansion as
- if it had appeared directly in the program. As a result, the compiled code
- produces the value and side effects intended for the macro, but executes at
- full compiled speed. This would not work if the macro body computed the value
- and side effects itself---they would be computed at compile time, which is not
- useful.
-
- In order for compilation of macro calls to work, the macros must be defined in
- Lisp when the calls to them are compiled. The compiler has a special feature
- to help you do this: if a file being compiled contains a defmacro form, the
- macro is defined temporarily for the rest of the compilation of that file. To
- use this feature, you must define the macro in the same file where it is used
- and before its first use.
-
- While byte-compiling a file, any require calls at top-level are executed. One
- way to ensure that necessary macro definitions are available during compilation
- is to require the file that defines them. See Features.
-
-
- ΓòÉΓòÉΓòÉ 15.4. Defining Macros ΓòÉΓòÉΓòÉ
-
- A Lisp macro is a list whose car is macro. Its cdr should be a function;
- expansion of the macro works by applying the function (with apply) to the list
- of unevaluated argument-expressions from the macro call.
-
- It is possible to use an anonymous Lisp macro just like an anonymous function,
- but this is never done, because it does not make sense to pass an anonymous
- macro to mapping functions such as mapcar. In practice, all Lisp macros have
- names, and they are usually defined with the special form defmacro.
-
- -- Special Form: defmacro name argument-list body-forms...
- defmacro defines the symbol name as a macro that looks like this:
-
- (macro lambda argument-list . body-forms)
-
- This macro object is stored in the function cell of name. The value returned
- by evaluating the defmacro form is name, but usually we ignore this value.
-
- The shape and meaning of argument-list is the same as in a function, and the
- keywords &rest and &optional may be used (see Argument List). Macros may have
- a documentation string, but any interactive declaration is ignored since macros
- cannot be called interactively.
-
-
- ΓòÉΓòÉΓòÉ 15.5. Backquote ΓòÉΓòÉΓòÉ
-
- It could prove rather awkward to write macros of significant size, simply due
- to the number of times the function list needs to be called. To make writing
- these forms easier, a macro ``' (often called backquote) exists.
-
- Backquote allows you to quote a list, but selectively evaluate elements of
- that list. In the simplest case, it is identical to the special form quote
- (see Quoting). For example, these two forms yield identical results:
-
- (` (a list of (+ 2 3) elements))
- => (a list of (+ 2 3) elements)
- (quote (a list of (+ 2 3) elements))
- => (a list of (+ 2 3) elements)
-
- By inserting a special marker, `,', inside of the argument to backquote, it is
- possible to evaluate desired portions of the argument:
-
- (list 'a 'list 'of (+ 2 3) 'elements)
- => (a list of 5 elements)
- (` (a list of (, (+ 2 3)) elements))
- => (a list of 5 elements)
-
- It is also possible to have an evaluated list spliced into the resulting list
- by using the special marker `,@'. The elements of the spliced list become
- elements at the same level as the other elements of the resulting list. The
- equivalent code without using ` is often unreadable. Here are some examples:
-
- (setq some-list '(2 3))
- => (2 3)
- (cons 1 (append some-list '(4) some-list))
- => (1 2 3 4 2 3)
- (` (1 (,@ some-list) 4 (,@ some-list)))
- => (1 2 3 4 2 3)
-
- (setq list '(hack foo bar))
- => (hack foo bar)
- (cons 'use
- (cons 'the
- (cons 'words (append (cdr list) '(as elements)))))
- => (use the words foo bar as elements)
- (` (use the words (,@ (cdr list)) as elements (,@ nil)))
- => (use the words foo bar as elements)
-
- The reason for (,@ nil) is to avoid a bug in Emacs version 18. The bug occurs
- when a call to ,@ is followed only by constant elements. Thus,
-
- (` (use the words (,@ (cdr list)) as elements))
-
- would not work, though it really ought to. (,@ nil) avoids the problem by
- being a nonconstant element that does not affect the result.
-
- -- Macro: ` list
- This macro returns list as quote would, except that the list is copied each
- time this expression is evaluated, and any sublist of the form (, subexp) is
- replaced by the value of subexp. Any sublist of the form (,@ listexp) is
- replaced by evaluating listexp and splicing its elements into the containing
- list in place of this sublist. (A single sublist can in this way be replaced
- by any number of new elements in the containing list.)
-
- There are certain contexts in which `,' would not be recognized and should not
- be used:
-
- ;; Use of a `,' expression as the cdr of a list.
- (` (a . (, 1))) ; Not (a . 1)
- => (a \, 1)
-
- ;; Use of `,' in a vector.
- (` [a (, 1) c]) ; Not [a 1 c]
- error--> Wrong type argument
-
- ;; Use of a `,' as the entire argument of ``'.
- (` (, 2)) ; Not 2
- => (\, 2)
-
- Common Lisp note: in Common Lisp, `,' and `,@' are implemented as reader
- macros, so they do not require parentheses. Emacs Lisp implements them as
- functions because reader macros are not supported (to save space).
-
-
- ΓòÉΓòÉΓòÉ 15.6. Common Problems Using Macros ΓòÉΓòÉΓòÉ
-
- The basic facts of macro expansion have all been described above, but there
- consequences are often counterintuitive. This section describes some important
- consequences that can lead to trouble, and rules to follow to avoid trouble.
-
-
- ΓòÉΓòÉΓòÉ 15.6.1. Evaluating Macro Arguments Too Many Times ΓòÉΓòÉΓòÉ
-
- When defining a macro you must pay attention to the number of times the
- arguments will be evaluated when the expansion is executed. The following
- macro (used to facilitate iteration) illustrates the problem. This macro allows
- us to write a simple ``for'' loop such as one might find in Pascal.
-
- (defmacro for (var from init to final do &rest body)
- "Execute a simple \"for\" loop, e.g.,
- (for i from 1 to 10 do (print i))."
- (list 'let (list (list var init))
- (cons 'while (cons (list '<= var final)
- (append body (list (list 'inc var)))))))
- => for
-
- (for i from 1 to 3 do
- (setq square (* i i))
- (princ (format "\n%d %d" i square)))
- ->
- (let ((i 1))
- (while (<= i 3)
- (setq square (* i i))
- (princ (format "%d %d" i square))
- (inc i)))
-
- -|1 1
- -|2 4
- -|3 9
- => nil
-
- (The arguments from, to, and do in this macro are ``syntactic sugar''; they are
- entirely ignored. The idea is that you will write noise words (such as from,
- to, and do) in those positions in the macro call.)
-
- This macro suffers from the defect that final is evaluated on every iteration.
- If final is a constant, this is not a problem. If it is a more complex form,
- say (long-complex-calculation x), this can slow down the execution
- significantly. If final has side effects, executing it more than once is
- probably incorrect.
-
- A well-designed macro definition takes steps to avoid this problem by producing
- an expansion that evaluates the argument expressions exactly once unless
- repeated evaluation is part of the intended purpose of the macro. Here is a
- correct expansion for the for macro:
-
- (let ((i 1)
- (max 3))
- (while (<= i max)
- (setq square (* i i))
- (princ (format "%d %d" i square))
- (inc i)))
-
- Here is a macro definition that creates this expansion:
-
- (defmacro for (var from init to final do &rest body)
- "Execute a simple for loop: (for i from 1 to 10 do (print i))."
- (` (let (((, var) (, init))
- (max (, final)))
- (while (<= (, var) max)
- (,@ body)
- (inc (, var))))))
-
- Unfortunately, this introduces another problem. Proceed to the following node.
-
-
- ΓòÉΓòÉΓòÉ 15.6.2. Local Variables in Macro Expansions ΓòÉΓòÉΓòÉ
-
- In the previous section, the definition of for was fixed as follows to make
- the expansion evaluate the macro arguments the proper number of times:
-
- (defmacro for (var from init to final do &rest body)
- "Execute a simple for loop: (for i from 1 to 10 do (print i))."
- (` (let (((, var) (, init))
- (max (, final)))
- (while (<= (, var) max)
- (,@ body)
- (inc (, var))))))
-
- The new definition of for has a new problem: it introduces a local variable
- named max which the user does not expect. This will cause trouble in examples
- such as the following:
-
- (let ((max 0))
- (for x from 0 to 10 do
- (let ((this (frob x)))
- (if (< max this)
- (setq max this)))))
-
- The references to max inside the body of the for, which are supposed to refer
- to the user's binding of max, will instead access the binding made by for.
-
- The way to correct this is to use an uninterned symbol instead of max (see
- Creating Symbols). The uninterned symbol can be bound and referred to just
- like any other symbol, but since it is created by for, we know that it cannot
- appear in the user's program. Since it is not interned, there is no way the
- user can put it into the program later. It will not appear anywhere except
- where put by for. Here is a definition of for which works this way:
-
- (defmacro for (var from init to final do &rest body)
- "Execute a simple for loop: (for i from 1 to 10 do (print i))."
- (let ((tempvar (make-symbol "max")))
- (` (let (((, var) (, init))
- ((, tempvar) (, final)))
- (while (<= (, var) (, tempvar))
- (,@ body)
- (inc (, var)))))))
-
- This creates an uninterned symbol named max and puts it in the expansion
- instead of the usual interned symbol max that appears in expressions
- ordinarily.
-
-
- ΓòÉΓòÉΓòÉ 15.6.3. Evaluating Macro Arguments in Expansion ΓòÉΓòÉΓòÉ
-
- Another problem can happen if you evaluate any of the macro argument
- expressions during the computation of the expansion, such as by calling eval
- (see Eval). If the argument is supposed to refer to the user's variables, you
- may have trouble if the user happens to use a variable with the same name as
- one of the macro arguments. Inside the macro body, the macro argument binding
- is the most local binding of this variable, so any references inside the form
- being evaluated will refer to it. Here is an example:
-
- (defmacro foo (a)
- (list 'setq (eval a) t))
- => foo
- (setq x 'b)
- (foo x) -> (setq b t)
- => t ; and b has been set.
- ;; but
- (setq a 'b)
- (foo a) -> (setq 'b t) ; invalid!
- error--> Symbol's value is void: b
-
- It makes a difference whether the user types a or x, because a conflicts with
- the macro argument variable a.
-
- In general it is best to avoid calling eval in a macro definition at all.
-
-
- ΓòÉΓòÉΓòÉ 15.6.4. How Many Times is the Macro Expanded? ΓòÉΓòÉΓòÉ
-
- Occasionally problems result from the fact that a macro call is expanded each
- time it is evaluated in an interpreted function, but is expanded only once
- (during compilation) for a compiled function. If the macro definition has side
- effects, they will work differently depending on how many times the macro is
- expanded.
-
- In particular, constructing objects is a kind of side effect. If the macro is
- called once, then the objects are constructed only once. In other words, the
- same structure of objects is used each time the macro call is executed. In
- interpreted operation, the macro is reexpanded each time, producing a fresh
- collection of objects each time. Usually this does not matter---the objects
- have the same contents whether they are shared or not. But if the surrounding
- program does side effects on the objects, it makes a difference whether they
- are shared. Here is an example:
-
- (defmacro new-object ()
- (list 'quote (cons nil nil)))
-
- (defun initialize (condition)
- (let ((object (new-object)))
- (if condition
- (setcar object condition))
- object))
-
- If initialize is interpreted, a new list (nil) is constructed each time
- initialize is called. Thus, no side-effect survives between calls. If
- initialize is compiled, then the macro new-object is expanded during
- compilation, producing a single ``constant'' (nil) that is reused and altered
- each time initialize is called.
-
-
- ΓòÉΓòÉΓòÉ 16. Loading ΓòÉΓòÉΓòÉ
-
- Loading a file of Lisp code means bringing its contents into the Lisp
- environment in the form of Lisp objects. Emacs finds and opens the file, reads
- the text, evaluates each form, and then closes the file.
-
- The load functions evaluate all the expressions in a file just as the
- eval-current-buffer function evaluates all the expressions in a buffer. The
- difference is that the load functions read and evaluate the text in the file as
- found on disk, not the text in an Emacs buffer.
-
- The loaded file must contain Lisp expressions, either as source code or,
- optionally, as byte-compiled code. Each form in the file is called a top-level
- form. There is no special format for the forms in a loadable file; any form in
- a file may equally well be typed directly into a buffer and evaluated there.
- (Indeed, most code is tested this way.) Most often, the forms are function
- definitions and variable definitions.
-
- A file containing Lisp code is often called a library. Thus, the ``Rmail
- library'' is a file containing code for Rmail mode. Similarly, a ``Lisp library
- directory'' is a directory of files containing Lisp code.
-
-
- ΓòÉΓòÉΓòÉ 16.1. How Programs Do Loading ΓòÉΓòÉΓòÉ
-
- There are several interface functions for loading. For example, the autoload
- function creates a Lisp object that loads a file when it is evaluated (see
- Autoload). require also causes files to be loaded (see Features). Ultimately,
- all these facilities call the load function to do the work.
-
- -- Function: load filename &optional missing-ok nomessage nosuffix
- This function finds and opens a file of Lisp code, evaluates all the forms in
- it, and closes the file.
-
- To find the file, load first looks for a file named `filename.elc', that is,
- for a file whose name has `.elc' appended. If such a file exists, it is
- loaded. But if there is no file by that name, then load looks for a file whose
- name has `.el' appended. If that file exists, it is loaded. Finally, if there
- is no file by either name, load looks for a file named filename with nothing
- appended, and loads it if it exists. (The load function is not clever about
- looking at filename. In the perverse case of a file named `foo.el.el',
- evaluation of (load "foo.el") will indeed find it.)
-
- If the optional argument nosuffix is non-nil, then the suffixes `.elc' and
- `.el' are not tried. In this case, the file name must be specified precisely.
-
- If filename is a relative file name, such as `foo.bar' or `baz/foo.bar', Emacs
- searches for the file using the variable load-path. Emacs does this by
- appending filename to each of the directories listed in load-path, and loading
- the first file it finds whose name matches. The current default directory is
- tried only if it is specified in load-path, where it is represented as nil.
- All three possible suffixes are tried in the first directory in load-path, then
- all three in the second directory in load-path, etc.
-
- Messages like `Loading foo...' and `Loading foo...done' are printed in the echo
- area while loading unless nomessage is non-nil.
-
- Any errors that are encountered while loading a file cause load to abort. If
- the load was done for the sake of autoload, certain kinds of top-level forms,
- those which define functions, are undone.
-
- The error file-error is signaled (with `Cannot open load file filename') if no
- file is found. No error is signaled if missing-ok is non-nil---then load just
- returns nil.
-
- load returns t if the file loads successfully.
-
- -- User Option: load-path
- The value of this variable is a list of directories to search when loading
- files with load. Each element is a string (which must be a directory name) or
- nil (which stands for the current working directory). The value of load-path
- is initialized from the environment variable EMACSLOADPATH, if it exists;
- otherwise it is set to the default specified in `emacs/src/paths.h' when Emacs
- is built.
-
- The syntax of EMACSLOADPATH is the same as that of PATH; fields are separated
- by `:', and `.' is used for the current default directory. Here is an example
- of how to set your EMACSLOADPATH variable from a csh `.login' file:
-
- setenv EMACSLOADPATH .:/user/liberte/emacs:/usr/local/lib/emacs/lisp
-
- Here is how to set it using sh:
-
- export EMACSLOADPATH
- EMACSLOADPATH=.:/user/liberte/emacs:/usr/local/lib/emacs/lisp
-
- Here is an example of code you can place in a `.emacs' file to add several
- directories to the front of your default load-path:
-
- (setq load-path
- (append
- (list nil
- "/user/liberte/emacs"
- "/usr/local/lisplib")
- load-path))
-
- In this example, the path searches the current working directory first,
- followed by `/user/liberte/emacs' and `/usr/local/lisplib', which are then
- followed by the standard directories for Lisp code.
-
- When Emacs 18 is processing command options `-l' or `-load' which specify Lisp
- libraries to be loaded, it temporarily adds the current directory to the front
- of load-path so that files in the current directory can be specified easily.
- Emacs version 19 will also find such files in the current directory but without
- altering load-path.
-
- -- Variable: load-in-progress
- This variable is non-nil if Emacs is in the process of loading a file, and it
- is nil otherwise. This is how defun and provide determine whether a load is in
- progress, so that their effect can be undone if the load fails.
-
- To learn how load is used to build Emacs, see Building Emacs.
-
-
- ΓòÉΓòÉΓòÉ 16.2. Autoload ΓòÉΓòÉΓòÉ
-
- The autoload facility allows you to make a function or macro available but put
- off loading its actual definition. An attempt to call a symbol whose
- definition is an autoload object automatically reads the file to install the
- real definition and its other associated code, and then calls the real
- definition.
-
- To prepare a function or macro for autoloading, you must call autoload,
- specifying the function name and the name of the file to be loaded. This is
- usually done when Emacs is first built, by files such as
- `emacs/lisp/loaddefs.el'.
-
- The following example shows how doctor is prepared for autoloading in
- `loaddefs.el':
-
- (autoload 'doctor "doctor"
- "\
- Switch to *doctor* buffer and start giving psychotherapy."
- t)
-
- The backslash and newline immediately following the double-quote are a
- convention used only in the preloaded Lisp files such as `loaddefs.el'; they
- cause the documentation string to be put in the `etc/DOC' file. (See Building
- Emacs.) In any other source file, you would write just this:
-
- (autoload 'doctor "doctor"
- "Switch to *doctor* buffer and start giving psychotherapy."
- t)
-
- Calling autoload creates an autoload object containing the name of the file
- and some other information, and makes this the definition of the specified
- symbol. When you later try to call that symbol as a function or macro, the
- file is loaded; the loading should redefine that symbol with its proper
- definition. After the file completes loading, the function or macro is called
- as if it had been there originally.
-
- If, at the end of loading the file, the desired Lisp function or macro has not
- been defined, then the error error is signaled (with data "Autoloading failed
- to define function function-name").
-
- The autoloaded file may, of course, contain other definitions and may require
- or provide one or more features. If the file is not completely loaded (due to
- an error in the evaluation of the contents) any function definitions or provide
- calls that occurred during the load are undone. This is to ensure that the
- next attempt to call any function autoloading from this file will try again to
- load the file. If not for this, then some of the functions in the file might
- appear defined, but they may fail to work properly for the lack of certain
- subroutines defined later in the file and not loaded successfully.
-
- -- Function: autoload symbol filename &optional docstring interactive macro
- This function defines the function (or macro) named symbol so as to load
- automatically from filename. The string filename is a file name which will be
- passed to load when the function is called.
-
- The argument docstring is the documentation string for the function.
- Normally, this is the same string that is in the function definition itself.
- This makes it possible to look at the documentation without loading the real
- definition.
-
- If interactive is non-nil, then the function can be called interactively.
- This lets completion in M-x work without loading the function's real
- definition. The complete interactive specification need not be given here. If
- macro is non-nil, then the function is really a macro.
-
- If symbol already has a non-nil function definition that is not an autoload
- object, autoload does nothing and returns nil. If the function cell of symbol
- is void, or is already an autoload object, then it is set to an autoload object
- that looks like this:
-
- (autoload filename docstring interactive macro)
-
- For example,
-
- (symbol-function 'run-prolog)
- => (autoload "prolog" 169681 t nil)
-
- In this case, "prolog" is the name of the file to load, 169681 is the reference
- to the documentation string in the `emacs/etc/DOC' file (see Documentation
- Basics), t means the function is interactive, and nil that it is not a macro.
-
-
- ΓòÉΓòÉΓòÉ 16.3. Repeated Loading ΓòÉΓòÉΓòÉ
-
- You may load a file more than once in an Emacs session. For example, after
- you have rewritten and reinstalled a function definition by editing it in a
- buffer, you may wish to return to the original version; you can do this by
- reloading the file in which it is located.
-
- When you load or reload files, bear in mind that the load and load-library
- functions automatically load a byte-compiled file rather than a non-compiled
- file of similar name. If you rewrite a file that you intend to save and
- reinstall, remember to byte-compile it if necessary; otherwise you may find
- yourself inadvertently reloading the older, byte-compiled file instead of your
- newer, non-compiled file!
-
- When writing the forms in a library, keep in mind that the library might be
- loaded more than once. For example, the choice of defvar vs. defconst for
- defining a variable depends on whether it is desirable to reinitialize the
- variable if the library is reloaded: defconst does so, and defvar does not.
- (See Defining Variables.)
-
- The simplest way to add an element to an alist is like this:
-
- (setq minor-mode-alist (cons '(leif-mode " Leif") minor-mode-alist))
-
- But this would add multiple elements if the library is reloaded. To avoid the
- problem, write this:
-
- (or (assq 'leif-mode minor-mode-alist)
- (setq minor-mode-alist
- (cons '(leif-mode " Leif") minor-mode-alist)))
-
- Occasionally you will want to test explicitly whether a library has already
- been loaded; you can do so as follows:
-
- (if (not (boundp 'foo-was-loaded))
- execute-first-time-only)
-
- (setq foo-was-loaded t)
-
-
- ΓòÉΓòÉΓòÉ 16.4. Features ΓòÉΓòÉΓòÉ
-
- provide and require are an alternative to autoload for loading files
- automatically. They work in terms of named features. Autoloading is triggered
- by calling a specific function, but a feature is loaded the first time another
- program asks for it by name.
-
- The use of named features simplifies the task of determining whether required
- definitions have been defined. A feature name is a symbol that stands for a
- collection of functions, variables, etc. A program that needs the collection
- may ensure that they are defined by requiring the feature. If the file that
- contains the feature has not yet been loaded, then it will be loaded (or an
- error will be signaled if it cannot be loaded). The file thus loaded must
- provide the required feature or an error will be signaled.
-
- To require the presence of a feature, call require with the feature name as
- argument. require looks in the global variable features to see whether the
- desired feature has been provided already. If not, it loads the feature from
- the appropriate file. This file should call provide at the top-level to add
- the feature to features.
-
- Features are normally named after the files they are provided in so that
- require need not be given the file name.
-
- For example, in `emacs/lisp/prolog.el', the definition for run-prolog includes
- the following code:
-
- (interactive)
- (require 'shell)
- (switch-to-buffer (make-shell "prolog" "prolog"))
- (inferior-prolog-mode))
-
- The expression (require 'shell) loads the file `shell.el' if it has not yet
- been loaded. This ensures that make-shell is defined.
-
- The `shell.el' file contains the following top-level expression:
-
- (provide 'shell)
-
- This adds shell to the global features list when the `shell' file is loaded, so
- that (require 'shell) will henceforth know that nothing needs to be done.
-
- When require is used at top-level in a file, it takes effect if you
- byte-compile that file (see Byte Compilation). This is in case the required
- package contains macros that the byte compiler must know about.
-
- Although top-level calls to require are evaluated during byte compilation,
- provide calls are not. Therefore, you can ensure that a file of definitions is
- loaded before it is byte-compiled by including a provide followed by a require
- for the same feature, as in the following example.
-
- (provide 'my-feature) ; Ignored by byte compiler, evaluated by load.
- (require 'my-feature) ; Evaluated by byte compiler.
-
- -- Function: provide feature
- This function announces that feature is now loaded, or being loaded, into the
- current Emacs session. This means that the facilities associated with feature
- are or will be available for other Lisp programs.
-
- The direct effect of calling provide is to add feature to the front of the list
- features if it is not already in the list. The argument feature must be a
- symbol. provide returns feature.
-
- features
- => (bar bish)
-
- (provide 'foo)
- => foo
- features
- => (foo bar bish)
-
- During autoloading, if the file is not completely loaded (due to an error in
- the evaluation of the contents) any function definitions or provide calls that
- occurred during the load are undone. See Autoload.
-
- -- Function: require feature &optional filename
- This function checks whether feature is present in the current Emacs session
- (using (featurep feature); see below). If it is not, then require loads
- filename with load. If filename is not supplied, then the name of the symbol
- feature is used as the file name to load.
-
- If feature is not provided after the file has been loaded, Emacs will signal
- the error error (with data `Required feature feature was not provided').
-
- -- Function: featurep feature
- This function returns t if feature has been provided in the current Emacs
- session (i.e., feature is a member of features.)
-
- -- Variable: features
- The value of this variable is a list of symbols that are the features loaded
- in the current Emacs session. Each symbol was put in this list with a call to
- provide. The order of the elements in the features list is not significant.
-
-
- ΓòÉΓòÉΓòÉ 17. Byte Compilation ΓòÉΓòÉΓòÉ
-
- GNU Emacs Lisp has a compiler that translates functions written in Lisp into a
- special representation called byte-code that can be executed more efficiently.
- The compiler replaces Lisp function definitions with byte-code. When a
- byte-code function is called, its definition is evaluated by the byte-code
- interpreter.
-
- Because the byte-compiled code is evaluated by the byte-code interpreter,
- instead of being executed directly by the machine's hardware (as true compiled
- code is), byte-code is completely transportable from machine to machine without
- recompilation. It is not, however, as fast as true compiled code.
-
- See Compilation Errors, for how to investigate errors occurring in byte
- compilation.
-
-
- ΓòÉΓòÉΓòÉ 17.1. The Compilation Functions ΓòÉΓòÉΓòÉ
-
- An individual function or macro definition may be byte-compiled with the
- byte-compile function. A whole file may be byte-compiled with
- byte-compile-file and several files may be byte-compiled with
- byte-recompile-directory or batch-byte-compile. Only defun and defmacro forms
- in a file are byte-compiled; other top-level forms are not altered by byte
- compilation.
-
- Be careful when byte-compiling code that uses macros. Macro calls are
- expanded when they are compiled, so the macros must already be defined for
- proper compilation. For more details, see Compiling Macros.
-
- While byte-compiling a file, any require calls at top-level are executed. One
- way to ensure that necessary macro definitions are available during compilation
- is to require the file that defines them. See Features.
-
- A byte-compiled function is not as efficient as a primitive function written
- in C, but will run much faster than the version written in Lisp. For a rough
- comparison, consider the example below:
-
- (defun silly-loop (n)
- "Return time before and after N iterations of a loop."
- (let ((t1 (current-time-string)))
- (while (> (setq n (1- n))
- 0))
- (list t1 (current-time-string))))
- => silly-loop
-
- (silly-loop 100000)
- => ("Thu Jan 12 20:18:38 1989"
- "Thu Jan 12 20:19:29 1989") ; 51 seconds
-
- (byte-compile 'silly-loop)
- => [Compiled code not shown]
-
- (silly-loop 100000)
- => ("Thu Jan 12 20:21:04 1989"
- "Thu Jan 12 20:21:17 1989") ; 13 seconds
-
- In this example, the interpreted code required 51 seconds to run, whereas the
- byte-compiled code required 13 seconds. These results are representative, but
- actual results will vary greatly.
-
- -- Function: byte-compile symbol
- This function byte-compiles the function definition of symbol, replacing the
- previous definition with the compiled one. The function definition of symbol
- must be the actual code for the function; i.e., the compiler will not follow
- indirection to another symbol. byte-compile does not compile macros.
- byte-compile returns the new, compiled definition of symbol.
-
- (defun factorial (integer)
- "Compute factorial of INTEGER."
- (if (= 1 integer) 1
- (* integer (factorial (1- integer)))))
- => factorial
-
- (byte-compile 'factorial)
- => (lambda (integer)
- "Compute factorial of INTEGER."
- (byte-code "\301^HU\203
- ^@\301\202^Q^@\302^H\303^HS!\"\207"
- [integer 1 * factorial] 4))
-
- The string that is the first argument of byte-code is the actual byte-code.
- Each character in it is an instruction. The vector contains all the constants,
- variable names and function names used by the function, except for certain
- primitives that are coded as special instructions.
-
- The byte-compile function is not autoloaded as are byte-compile-file and
- byte-recompile-directory.
-
- -- Command: byte-compile-file filename
- This function compiles a file of Lisp code named filename into a file of
- byte-code. The output file's name is made by appending `c' to the end of
- filename.
-
- Compilation works by reading the input file one form at a time. If it is a
- definition of a function or macro, the compiled function or macro definition is
- written out. Other forms are copied out unchanged. All comments are discarded
- when the input file is read.
-
- This command returns t. When called interactively, it prompts for the file
- name.
-
- % ls -l push*
- -rw-r--r-- 1 lewis 791 Oct 5 20:31 push.el
-
- (byte-compile-file "~/emacs/push.el")
- => t
-
- % ls -l push*
- -rw-r--r-- 1 lewis 791 Oct 5 20:31 push.el
- -rw-rw-rw- 1 lewis 638 Oct 8 20:25 push.elc
-
- -- Command: byte-recompile-directory directory flag
- This function recompiles every `.el' file in directory that needs
- recompilation. A file needs recompilation if a `.elc' file exists but is older
- than the `.el' file.
-
- If a `.el' file exists, but there is no corresponding `.elc' file, then flag
- is examined. If it is nil, the file is ignored. If it is non-nil, the user is
- asked whether the file should be compiled.
-
- The returned value of this command is unpredictable.
-
- -- Function: batch-byte-compile
- This function runs byte-compile-file on the files remaining on the command
- line. This function must be used only in a batch execution of Emacs, as it
- kills Emacs on completion. Each file will be processed, even if an error
- occurs while compiling a previous file. (The file with the error will not, of
- course, produce any compiled code.)
-
- % emacs -batch -f batch-byte-compile *.el
-
- -- Function: byte-code code-string data-vector max-stack
- This is the function that actually interprets byte-code. A byte-compiled
- function is actually defined with a body that calls byte-code. Don't call this
- function yourself. Only the byte compiler knows how to generate valid calls to
- this function.
-
-
- ΓòÉΓòÉΓòÉ 17.2. Disassembled Byte-Code ΓòÉΓòÉΓòÉ
-
- People do not write byte-code; that job is left to the byte compiler. But we
- provide a disassembler to satisfy a cat-like curiosity. The disassembler
- converts the byte-compiled code into humanly readable form.
-
- The byte-code interpreter is implemented as a simple stack machine. Values get
- stored by being pushed onto the stack, and are popped off and manipulated, the
- results being pushed back onto the stack. When a function returns, the top of
- the stack is popped and returned as the value of the function.
-
- In addition to the stack, values used during byte-code execution can be stored
- in ordinary Lisp variables. Variable values can be pushed onto the stack, and
- variables can be set by popping the stack.
-
- -- Command: disassemble object &optional stream
- This function prints the disassembled code for object. If stream is supplied,
- then output goes there. Otherwise, the disassembled code is printed to the
- stream standard-output. The argument object can be a function name or a lambda
- expression.
-
- As a special exception, if this function is used interactively, it outputs to a
- buffer named `*Disassemble*'.
-
- Here are two examples of using the disassemble function. We have added
- explanatory comments to help you relate the byte-code to the Lisp source; these
- do not appear in the output of disassemble.
-
- (defun factorial (integer)
- "Compute factorial of an integer."
- (if (= 1 integer) 1
- (* integer (factorial (1- integer)))))
- => factorial
-
- (factorial 4)
- => 24
-
- (disassemble 'factorial)
- -| byte-code for factorial:
- doc: Compute factorial of an integer.
- args: (integer)
-
- 0 constant 1 ; Push 1 onto stack.
-
- 1 varref integer ; Get value of integer from the environment
- ; and push the value onto the stack.
-
- 2 eqlsign ; Pop top two values off stack,
- ; compare them,
- ; and push result onto stack.
-
- 3 goto-if-nil 10 ; Pop and test top of stack;
- ; if nil, go to 10,
- ; else continue.
-
- 6 constant 1 ; Push 1 onto top of stack.
-
- 7 goto 17 ; Go to 17 (in this case, 1 will be
- ; returned by the function).
-
- 10 constant * ; Push symbol * onto stack.
-
- 11 varref integer ; Push value of integer onto stack.
-
- 12 constant factorial ; Push factorial onto stack.
-
- 13 varref integer ; Push value of integer onto stack.
-
- 14 sub1 ; Pop integer, decrement value,
- ; push new value onto stack.
-
- ; Stack now contains:
- ; decremented value of integer
- ; factorial
- ; value of integer
- ; *
-
- 15 call 1 ; Call function factorial using
- ; the first (i.e., the top) element
- ; of the stack as the argument;
- ; push returned value onto stack.
-
- ; Stack now contains:
- ; result of result of recursive
- ; call to factorial
- ; value of integer
- ; *
-
- 16 call 2 ; Using the first two (i.e., the top two)
- ; elements of the stack as arguments,
- ; call the function *,
- ; pushing the result onto the stack.
-
- 17 return ; Return the top element of the stack.
-
- => nil
-
- The silly-loop function is somewhat more complex:
-
- (defun silly-loop (n)
- "Return time before and after N iterations of a loop."
- (let ((t1 (current-time-string)))
- (while (> (setq n (1- n))
- 0))
- (list t1 (current-time-string))))
- => silly-loop
-
- (disassemble 'silly-loop)
- -| byte-code for silly-loop:
- doc: Return time before and after N iterations of a loop.
- args: (n)
-
- 0 constant current-time-string ; Push current-time-string
- ; onto top of stack.
-
- 1 call 0 ; Call current-time-string with no
- ; argument, pushing result onto stack.
-
- 2 varbind t1 ; Pop stack and bind t1 to popped value.
-
- 3 varref n ; Get value of n from the environment
- ; and push the value onto the stack.
-
- 4 sub1 ; Subtract 1 from top of stack.
-
- 5 dup ; Duplicate the top of the stack;
- ; i.e. copy the top of the stack
- ; and push the copy onto the stack.
-
- 6 varset n ; Pop the top of the stack,
- ; and bind n to the value.
-
- ; In effect, the sequence dup varset copies
- ; the top of the stack into the value of n
- ; without popping it.
-
- 7 constant 0 ; Push 0 onto stack.
-
- 8 gtr ; Pop top two values off stack,
- ; test if n is greater than 0
- ; and push result onto stack.
-
- 9 goto-if-nil-else-pop 17 ; Goto 17 if n > 0 else pop top of stack and continue
- ; (this exits the while loop).
-
- 12 constant nil ; Push nil onto stack
- ; (this is the body of the loop).
-
- 13 discard ; Discard result of the body of the loop
- ; (a while loop is always evaluated
- ; for its side effects).
-
- 14 goto 3 ; Jump back to beginning of while loop.
-
- 17 discard ; Discard result of while loop
- ; by popping top of stack.
-
- 18 varref t1 ; Push value of t1 onto stack.
-
- 19 constant current-time-string ; Push current-time-string
- ; onto top of stack.
-
- 20 call 0 ; Call current-time-string again.
-
- 21 list2 ; Pop top two elements off stack,
- ; create a list of them,
- ; and push list onto stack.
-
- 22 unbind 1 ; Unbind t1 in local environment.
-
- 23 return ; Return value of the top of stack.
-
- => nil
-
-
- ΓòÉΓòÉΓòÉ 18. Debugging Lisp Programs ΓòÉΓòÉΓòÉ
-
- There are three ways to investigate a problem in an Emacs Lisp program,
- depending on what you are doing with the program when the problem appears.
-
- o If the problem occurs when you run the program, you can use the Lisp debugger
- to investigate what is happening during execution.
-
- o If the problem is syntactic, so that Lisp cannot even read the program, you
- can use the Emacs facilities for editing Lisp to localize it.
-
- o If the problem occurs when trying to compile the program with the byte
- compiler, you need to know how to examine the compiler's input buffer.
-
- Another useful debugging tool is a dribble file. When a dribble file is open,
- Emacs copies all keyboard input characters to that file. Afterward, you can
- examine the file to find out what input was used. See Terminal Input.
-
- For debugging problems in terminal descriptions, the open-termscript function
- can be useful. See Terminal Output.
-
-
- ΓòÉΓòÉΓòÉ 18.1. The Lisp Debugger ΓòÉΓòÉΓòÉ
-
- The Lisp debugger provides you with the ability to suspend evaluation of a
- form. While evaluation is suspended (a state that is commonly known as a
- break), you may examine the run time stack, examine the values of local or
- global variables, or change those values. Since a break is a recursive edit,
- all the usual editing facilities of Emacs are available; you can even run
- programs that will enter the debugger recursively. See Recursive Editing.
-
-
- ΓòÉΓòÉΓòÉ 18.1.1. Entering the Debugger When an Error Occurs ΓòÉΓòÉΓòÉ
-
- The most important time to enter the debugger is when a Lisp error happens.
- This allows you to investigate the immediate causes of the error.
-
- However, entry to the debugger is not a normal consequence of an error. Many
- commands frequently get Lisp errors when invoked in inappropriate contexts
- (such as C-f at the end of the buffer) and during ordinary editing it would be
- very unpleasant to enter the debugger each time this happens. If you want
- errors to enter the debugger, set the variable debug-on-error to non-nil.
-
- -- User Option: debug-on-error
- This variable determines whether the debugger is called when a error is
- signaled and not handled. If debug-on-error is non-nil, then the debugger is
- called when an error happens. Otherwise the debugger is not called for errors.
-
-
- ΓòÉΓòÉΓòÉ 18.2. Debugging Infinite Loops ΓòÉΓòÉΓòÉ
-
- When a program loops infinitely and fails to return, your first problem is to
- stop the loop. On most operating systems, you can do this with C-g, which
- causes quit. This works if you are not using X windows, and on Berkeley
- systems even if you are using X windows.
-
- On other inferior operating systems, C-g does not work when using X windows.
- This is because these systems do not allow Emacs to request a signal when input
- arrives from the X server. There is nothing Emacs can do about this.
-
- However, you can still stop a loop by sending Emacs the SIGINT signal. To do
- this, go to a shell in another window, use ps to find out the pid of the Emacs
- process, and then type `kill -INT pid'.
-
- Ordinary quitting gives no information about why the program was looping. To
- get more information, you can set the variable debug-on-quit to non-nil.
- Quitting with C-g is not considered an error, and debug-on-error has no effect
- on the handling of C-g. debug-on-quit has no effect on errors.
-
- Once you have the debugger running in the middle of the infinite loop, you can
- proceed from the debugger using the stepping commands. If you step through the
- entire loop, you will probably get enough information to solve the problem.
-
- -- User Option: debug-on-quit
- This variable determines whether the debugger is called when quit is signaled
- and not handled. If debug-on-quit is non-nil, then the debugger is called
- whenever you quit (that is, type C-g). If debug-on-quit is nil, then the
- debugger is not called when you quit. See Quitting.
-
-
- ΓòÉΓòÉΓòÉ 18.2.1. Entering the Debugger when Some Function is Called ΓòÉΓòÉΓòÉ
-
- To investigate a problem that happens in the middle of a program, one useful
- technique is to cause the debugger to be entered when a certain function is
- called. You can do this to the function in which the problem occurs, and then
- step through the function, or you can do this to a function called shortly
- before the problem, step quickly over the call to that function, and then step
- through its caller.
-
- -- Command: debug-on-entry function-name
- This function requests function-name to invoke the debugger each time it is
- called. It works by inserting the form (debug 'debug) into the function
- definition as the first form.
-
- Any function defined as Lisp code may be set to break on entry, regardless of
- whether it is interpreted code or compiled code. Even functions that are
- commands may be debugged---they will enter the debugger when called inside a
- function, or when called interactively. Primitive functions (i.e., those
- written in C) may not be debugged.
-
- When debug-on-entry is called interactively, it prompts for function-name in
- the minibuffer.
-
- If debug-on-entry is called more than once on the same function, the second
- call does nothing. debug-on-entry returns function-name.
-
- (defun fact (n)
- (if (zerop n) 1
- (* n (fact (1- n)))))
- => fact
- (debug-on-entry 'fact)
- => fact
- (fact 3)
- => 6
-
- ---------- Buffer: *Backtrace* ----------
- Entering:
- * fact(3)
- eval-region(4870 4878 t)
- byte-code("...")
- eval-last-sexp(nil)
- (let ...)
- eval-insert-last-sexp(nil)
- * call-interactively(eval-insert-last-sexp)
- ---------- Buffer: *Backtrace* ----------
-
- (symbol-function 'fact)
- => (lambda (n)
- (debug (quote debug))
- (if (zerop n) 1 (* n (fact (1- n)))))
-
- -- Command: cancel-debug-on-entry function-name
- This function undoes the effect of debug-on-entry on function-name. When
- called interactively, it prompts for function-name in the minibuffer.
-
- If cancel-debug-on-entry is called more than once on the same function, the
- second call does nothing. cancel-debug-on-entry returns function-name.
-
-
- ΓòÉΓòÉΓòÉ 18.2.2. Explicit Entry to the Debugger ΓòÉΓòÉΓòÉ
-
- You can cause the debugger to be called at a certain point in your program by
- writing the expression (debug) at that point. To do this, visit the source
- file, insert the text `(debug)' at the proper place, and type C-M-x. Be sure
- to undo this insertion before you save the file!
-
- The place where you insert `(debug)' must be a place where an additional form
- can be evaluated and its value ignored. (If the value isn't ignored, it will
- alter the execution of the program!) Usually this means inside a progn or an
- implicit progn (see Sequencing).
-
-
- ΓòÉΓòÉΓòÉ 18.2.3. Using the Debugger ΓòÉΓòÉΓòÉ
-
- When the debugger is entered, it displays the previously selected buffer in
- one window and a buffer named `*Backtrace*' in another window. The backtrace
- buffer contains one line for each level of Lisp function execution currently
- going on. At the beginning of this buffer is a message describing the reason
- that the debugger was invoked (such as the error message and associated data,
- if it was invoked due to an error).
-
- The backtrace buffer is read-only and uses a special major mode, Debugger
- mode, in which letters are defined as debugger commands. The usual Emacs
- editing commands are available; thus, you can switch windows to examine the
- buffer that was being edited at the time of the error, switch buffers, visit
- files, or do any other sort of editing. However, the debugger is a recursive
- editing level (see Recursive Editing) and it is wise to go back to the
- backtrace buffer and exit the debugger (with the q command) when you you are
- finished with it. Exiting the debugger gets out of the recursive edit and
- kills the backtrace buffer.
-
- The contents of the backtrace buffer show you the functions that are executing
- and the arguments that were given to them. It also allows you to specify a
- stack frame by moving point to the line describing that frame. (A stack frame
- is the place where the Lisp interpreter records information about a particular
- invocation of a function. The frame whose line point is on is considered the
- current frame.) Some of the debugger commands operate on the current frame.
-
- The debugger itself should always be run byte-compiled, since it makes
- assumptions about how many stack frames are used for the debugger itself.
- These assumptions are false if the debugger is running interpreted.
-
-
- ΓòÉΓòÉΓòÉ 18.2.4. Debugger Commands ΓòÉΓòÉΓòÉ
-
- Inside the debugger (in Debugger mode), these special commands are available
- in addition to the usual cursor motion commands. (Keep in mind that all the
- usual facilities of Emacs, such as switching windows or buffers, are still
- available.)
-
- The most important use of debugger commands is for stepping through code, so
- that you can see how control flows. The debugger can step through the control
- structures of an interpreted function, but cannot do so in a byte-compiled
- function. If you would like to step through a byte-compiled function, replace
- it with an interpreted definition of the same function. (To do this, visit the
- source file for the function and type C-M-x on its definition.)
-
- c
- Exit the debugger and continue execution. When continuing is
- possible, it resumes execution of the program as if the debugger had
- never been entered (aside from the effect of any variables or data
- structures you may have changed while inside the debugger).
-
- Continuing is possible after entry to the debugger due to function
- entry or exit, explicit invocation, quitting or certain errors. Most
- errors cannot be continued; trying to continue an unsuitable error
- causes the same error to occur again.
-
- d
- Continue execution, but enter the debugger the next time any Lisp
- function is called. This allows you to step through the
- subexpressions of an expression, seeing what values the
- subexpressions compute, and what else they do.
-
- The stack frame made for the function call which enters the debugger
- in this way will be flagged automatically so that the debugger will
- be called again when the frame is exited. You can use the u command
- to cancel this flag.
-
- b
- Flag the current frame so that the debugger will be entered when the
- frame is exited. Frames flagged in this way are marked with stars in
- the backtrace buffer.
-
- u
- Don't enter the debugger when the current frame is exited. This
- cancels a b command on that frame.
-
- e
- Read a Lisp expression in the minibuffer, evaluate it, and print the
- value in the echo area. This is the same as the command M-ESC,
- except that e is not normally disabled like M-ESC.
-
- q
- Terminate the program being debugged; return to top-level Emacs
- command execution.
-
- If the debugger was entered due to a C-g but you really want to quit,
- and not debug, use the q command.
-
- r
- Return a value from the debugger. The value is computed by reading
- an expression with the minibuffer and evaluating it.
-
- The r command makes a difference when the debugger was invoked due to
- exit from a Lisp call frame (as requested with b); then the value
- specified in the r command is used as the value of that frame.
-
- The r also matters in certain cases of errors. For example,
- wrong-type-argument errors will use the debugger's return value
- instead of the invalid argument; no-catch errors will use the
- debugger value as a throw tag instead of the tag that was not found.
- If an error was signaled by calling the Lisp function signal, the
- debugger's return value is returned as the value of signal.
-
-
- ΓòÉΓòÉΓòÉ 18.2.5. Invoking the Debugger ΓòÉΓòÉΓòÉ
-
- Here we describe fully the function used to invoke the debugger.
-
- -- Function: debug &rest debugger-args
- This function enters the debugger. It switches buffers to a buffer named
- `*Backtrace*' (or `*Backtrace*<2>' if it is the second recursive entry to the
- debugger, etc.), and fills it with information about the stack of Lisp function
- calls. It then enters a recursive edit, leaving that buffer in Debugger mode
- and displayed in the selected window.
-
- Debugger mode provides a c command which operates by exiting the recursive
- edit, switching back to the previous buffer, and returning to whatever called
- debug. The r command also returns from debug. These are the only ways the
- function debug can return to its caller.
-
- If the first of the debugger-args passed to debug is nil (or if it is not one
- of the following special values), then the rest of the arguments to debug are
- printed at the top of the `*Backtrace*' buffer. This mechanism is used to
- display a message to the user.
-
- However, if the first argument passed to debug is one of the following special
- values, then it has special significance. Normally, these values are passed to
- debug only by the internals of Emacs and the debugger, and not by programmers
- calling debug.
-
- The special values are:
-
- lambda
- When the first argument is lambda, the debugger displays `Entering:'
- as a line of text at the top of the buffer. This means that a
- function is being entered when debug-on-next-call is non-nil.
-
- debug
- When the first argument is debug, the debugger displays `Entering:'
- just as in the lambda case. However, debug as the argument indicates
- that the reason for entering the debugger is that a function set to
- debug on entry is being entered.
-
- In addition, debug as the first argument directs the debugger to
- mark the function that called debug so that it will invoke the
- debugger when exited. (When lambda is the first argument, the
- debugger does not do this, because it has already been done by the
- interpreter.)
-
- t
- When the first argument is t, the debugger displays `Beginning
- evaluation of function call form:' as the top line in the buffer, to
- indicate that it was entered due to the evaluation of a list form at
- a time when debug-on-next-call is non-nil.
-
- exit
- When the first argument is exit, it indicates the exit of a stack
- frame previously marked to invoke the debugger on exit. The debugger
- displays `Return value:' on the top line of the buffer, followed by
- the value being returned from the frame.
-
- error
- When the first argument is error, the debugger indicates that it is
- being entered because an error or quit was signaled and not handled,
- by displaying `Signaling:' followed by the error signaled and any
- arguments to signal. For example,
-
- (let ((debug-on-error t))
- (/ 1 0))
-
- ---------- Buffer: *Backtrace* ----------
- Signaling: (arith-error)
- /(1 0)
- ...
-
- If an error was signaled, presumably the variable debug-on-error is
- non-nil. If quit was signaled, then presumably the variable
- debug-on-quit is non-nil.
-
- nil
- Use nil as the first of the debugger-args when you want to enter the
- debugger explicitly. The rest of the debugger-args are printed on
- the top line of the buffer. You can use this feature to display
- messages---for example, to remind yourself of the conditions under
- which debug is called.
-
-
- ΓòÉΓòÉΓòÉ 18.2.6. Internals of the Debugger ΓòÉΓòÉΓòÉ
-
- This section describes functions and variables used internally by the
- debugger.
-
- -- Variable: debugger
- The value of this variable is the function to call to invoke the debugger.
- Its value must be a function of any number of arguments (or, more typically,
- the name of a function). Presumably this function will enter some kind of
- debugger. The default value of the variable is debug.
-
- The first argument that Lisp hands to the function indicates why it was
- called. The convention for arguments is detailed in the description of debug.
-
- -- Command: backtrace
- This function prints a trace of Lisp function calls currently active. This is
- the function used by debug to fill up the `*Backtrace*' buffer. It is written
- in C, since it must have access to the stack to determine which function calls
- are active. The return value is always nil.
-
- In the following example, backtrace is called explicitly in a Lisp expression.
- When the expression is evaluated, the backtrace is printed to the stream
- standard-output: in this case, to the buffer `backtrace-output'. Each line of
- the backtrace represents one function call. If the arguments of the function
- call are all known, they are displayed; if they are being computed, that fact
- is stated. The arguments of special forms are elided.
-
- (with-output-to-temp-buffer "backtrace-output"
- (let ((var 1))
- (save-excursion
- (setq var (eval '(progn
- (1+ var)
- (list 'testing (backtrace))))))))
-
- => nil
- ----------- Buffer: backtrace-output ------------
- backtrace()
- (list ...computing arguments...)
- (progn ...)
- eval((progn (1+ var) (list (quote testing) (backtrace))))
- (setq ...)
- (save-excursion ...)
- (let ...)
- (with-output-to-temp-buffer ...)
- eval-region(1973 2142 #<buffer *scratch*>)
- byte-code("... for eval-print-last-sexp ...")
- eval-print-last-sexp(nil)
- * call-interactively(eval-print-last-sexp)
- ----------- Buffer: backtrace-output ------------
-
- -- User Option: stack-trace-on-error
- This variable controls whether Lisp automatically displays a backtrace buffer
- after every error that is not handled. A quit signal counts as an error for
- this variable. If it is non-nil then a backtrace is shown in a pop-up buffer
- named `*Backtrace*' on every error. If it is nil, then a backtrace is not
- shown.
-
- When a backtrace is shown, that buffer is not selected. If either
- debug-on-quit or debug-on-error is also non-nil, then a backtrace is shown in
- one buffer, and the debugger is popped up in another buffer with its own
- backtrace.
-
- We consider this feature to be obsolete and superseded by the debugger itself.
-
- -- Variable: debug-on-next-call
- This variable determines whether the debugger is called before the next eval,
- apply or funcall. It is automatically reset to nil when the debugger is
- entered.
-
- The d command in the debugger works by setting this variable.
-
- -- Function: backtrace-debug level flag
- This function sets the debug-on-exit flag of the eval frame level levels down
- to flag. If flag is non-nil, this will cause the debugger to be entered when
- that frame exits.
-
- The debug-on-exit flag is an entry in the stack frame of a function call.
- This flag is examined on every exit from a function.
-
- Normally, this function is only called by the debugger.
-
-
- ΓòÉΓòÉΓòÉ 18.3. Debugging Invalid Lisp Syntax ΓòÉΓòÉΓòÉ
-
- It is easy to make a syntax error in an Emacs Lisp program by omitting a
- parenthesis. The Lisp reader will detect an error, but cannot say where the
- real problem is. For example, if a close parenthesis is omitted, the reader
- will detect an imbalance at the end of the file, but it cannot tell anything
- about where the close parenthesis should have been. However, you can use the
- following techniques to figure out where.
-
- If the problem is not simply an imbalance of parentheses, a useful technique
- is to try C-M-e at the beginning of each defun, and see if it goes to the place
- where that defun appears to end. If it does not, there is a problem in that
- defun.
-
- However, unmatched parentheses are the most common syntax errors in Lisp, and
- we can give further advice for those cases.
-
-
- ΓòÉΓòÉΓòÉ 18.3.1. Excess Open Parentheses ΓòÉΓòÉΓòÉ
-
- The first step is to find the defun that is unbalanced. If there is an excess
- open parenthesis, the way to do this is to insert a close parenthesis at the
- end of the file and type C-M-b (backward-sexp). This will move you to the
- beginning of the defun that is unbalanced. (Then type C-SPC C-_ C-u C-SPC to
- set the mark there, undo the insertion of the close parenthesis, and finally
- return to the mark.)
-
- The next step is to determine precisely what is wrong. There is no way to be
- sure of this except to study the program, but often the existing indentation is
- a clue to where the parentheses should have been. The easiest way to use this
- clue is to reindent with C-M-q and see what moves.
-
- Before you do this, make sure the defun has enough close parentheses.
- Otherwise, C-M-q will get an error, or will reindent all the rest of the file
- until the end. So move to the end of the defun and insert a close parenthesis
- there. Don't use C-M-e to move there, since that too will fail to work until
- the defun is balanced.
-
- Then go to the beginning of the defun and type C-M-q. Usually all the lines
- from a certain point to the end of the function will shift to the right. There
- is probably a missing close parenthesis, or a superfluous open parenthesis,
- near that point. (However, don't assume this is true; study the code to make
- sure.) Once you have found the discrepancy, undo the C-M-q, since the old
- indentation is probably appropriate to the intended parentheses.
-
- After you think you have fixed the problem, use C-M-q again. It should not
- change anything, if the problem is really fixed.
-
-
- ΓòÉΓòÉΓòÉ 18.3.2. Excess Close Parentheses ΓòÉΓòÉΓòÉ
-
- To deal with an excess close parenthesis, first insert an open parenthesis at
- the beginning of the file and type C-M-f to find the end of the unbalanced
- defun. (Then type C-SPC C-_ C-u C-SPC to set the mark there, undo the
- insertion of the open parenthesis, and finally return to the mark.)
-
- Then find the actual matching close parenthesis by typing C-M-f at the
- beginning of the defun. This will leave you somewhere short of the place where
- the defun ought to end. It is possible that you will find a spurious close
- parenthesis in that vicinity.
-
- If you don't see a problem at that point, the next thing to do is to type
- C-M-q at the beginning of the defun. A range of lines will probably shift
- left; if so, the missing open parenthesis or spurious close parenthesis is
- probably near the first of those lines. (However, don't assume this is true;
- study the code to make sure.) Once you have found the discrepancy, undo the
- C-M-q, since the old indentation is probably appropriate to the intended
- parentheses.
-
-
- ΓòÉΓòÉΓòÉ 18.4. Debugging Problems in Compilation ΓòÉΓòÉΓòÉ
-
- When an error happens during byte compilation, it is normally due to an error
- in the program you are compiling. The compiler itself can't tell you where in
- the file the error occurred, so here is how to find out.
-
- What you should do is switch to the buffer `*Compiler Input*'. (Note that the
- buffer name starts with a space, so it will not show up in M-x list-buffers.)
- This buffer contains the program being compiled, and point shows how far the
- byte compiler was able to read.
-
- If the error was due to invalid Lisp syntax, point shows exactly where the
- invalid syntax was detected. The cause of the error is not necessarily near
- by! Use the techniques in the previous section to find the error.
-
- If the error was detected while compiling a form that had been read
- successfully, then point is located at the end of the form. In this case, it
- can't localize the error precisely, but can still show you which function to
- check.
-
-
- ΓòÉΓòÉΓòÉ 19. Reading and Printing Lisp Objects ΓòÉΓòÉΓòÉ
-
- Printing and reading are the operations of converting Lisp objects to textual
- form and vice versa. They use the printed representations and read syntax
- described in Types of Lisp Object.
-
- This chapter describes the Lisp functions for reading and printing. It also
- describes streams, which specify where to get the text (if reading) or where to
- put it (if printing).
-
-
- ΓòÉΓòÉΓòÉ 19.1. Introduction to Reading and Printing ΓòÉΓòÉΓòÉ
-
- Reading a Lisp object means parsing a Lisp expression in textual form and
- producing a corresponding Lisp object. This is how Lisp programs get into Lisp
- from files of Lisp code. We call the text the read syntax of the object. For
- example, reading the text `(a . 5)' returns a cons cell whose car is a and
- whose cdr is the number 5.
-
- Printing a Lisp object means producing text that represents that
- object---converting the object to its printed representation. Printing the
- cons cell described above produces the text `(a . 5)'.
-
- Reading and printing are usually inverse operations: printing the object that
- results from reading a given piece of text often produces the same text, and
- reading the text that results from printing an object usually produces a
- similar-looking object. For example, printing the symbol foo produces the text
- `foo', and reading that text returns the symbol foo. Printing a list whose
- elements are a and b produces the text `(a b)', and reading that text produces
- a list (but not the same list) with elements are a and b.
-
- However, these two operations are not precisely inverses. There are two kinds
- of exceptions:
-
- o Printing can produce text that cannot be read. For example, buffers,
- windows, subprocesses and markers print into text that starts with `#'; if
- you try to read this text, you get an error. There is no way to read those
- data types.
-
- o One object can have multiple textual representations. For example, `1' and
- `01' represent the same integer, and `(a b)' and `(a . (b))' represent the
- same list. Reading will accept any of the alternatives, but printing must
- choose one of them.
-
-
- ΓòÉΓòÉΓòÉ 19.2. Input Streams ΓòÉΓòÉΓòÉ
-
- Most of the Lisp functions for reading text take an input stream as an
- argument. The input stream specifies where or how to get the characters of the
- text to be read. Here are the possible types of input stream:
-
- buffer
- The input characters are read from buffer, starting with the
- character directly after point. Point advances as characters are
- read.
-
- marker
- The input characters are read from the buffer that marker is in,
- starting with the character directly after the marker. The marker
- position advances as characters are read. The value of point in the
- buffer has no effect when the stream is a marker.
-
- string
- The input characters are taken from string, starting at the first
- character in the string and using as many characters as required.
-
- function
- The input characters are generated by function, one character per
- call. In version 18, function is always called with no arguments and
- should return a character.
-
- t
- t used as a stream means that the input is read from the minibuffer.
- In fact, the minibuffer is invoked once and the text given by the
- user is made into a string that is then used as the input stream.
-
- nil
- nil used as a stream means that the value of standard-input should be
- used instead; that value is the default input stream, and must be a
- non-nil input stream.
-
- Here is an example of reading from a stream which is a buffer, showing where
- point is located before and after:
-
- ---------- Buffer: foo ----------
- This-!- is the contents of foo.
- ---------- Buffer: foo ----------
-
- (read (get-buffer "foo"))
- => is
- (read (get-buffer "foo"))
- => the
-
- ---------- Buffer: foo ----------
- This is the -!-contents of foo.
- ---------- Buffer: foo ----------
-
- Note that the first read skips a space at the beginning of the buffer. Reading
- skips any amount of whitespace preceding the significant text. Note also that
- the second read skips the space which terminates the symbol the. It has to
- read this space in order to know that no more letters follow.
-
- Here is an example of reading from a stream that is a marker, initialized to
- point at the beginning of the buffer shown. The value of the read is the
- symbol This.
-
- ---------- Buffer: foo ----------
- This is the contents of foo.
- ---------- Buffer: foo ----------
-
- (setq m (set-marker (make-marker) 1 (get-buffer "foo")))
- => #<marker at 1 in foo>
- (read m)
- => This
- m
- => #<marker at 6 in foo> ;; After the first space.
-
- Here we read from the contents of a string:
-
- (read "(When in) the course")
- => (When in)
-
- The following example reads from the minibuffer, prompting with `Lisp
- expression: '. (That is always the prompt used when you read from the stream
- t.) The user's input is shown following the prompt.
-
- (read t)
- => 23
- ---------- Buffer: Minibuffer ----------
- Lisp expression: 23 RET
-
- Finally, here is an example of a stream that is a function, named
- useless-stream. Before we use the stream, we initialize the variable
- useless-list to a list of characters. Then each call to the function
- useless-stream obtains the next letter in the list:
-
- (setq useless-list (append "XY()" nil))
- => (88 89 40 41)
-
- (defun useless-stream ()
- (prog1 (car useless-list)
- (setq useless-list (cdr useless-list))))
- => useless-stream
-
- Now we read using the stream thus constructed:
-
- (read 'useless-stream)
- => XY
-
- useless-list
- => (41)
-
- Note that the close parenthesis remains in the list. This is because the open
- parenthesis was read before the Lisp reader knew it had found the end of the
- symbol. A second attempt to read from the stream at this point would get an
- error due to the unmatched close parenthesis.
-
- -- Function: get-file-char
- This function is used internally as an input stream to read from the input file
- opened by the function load. Don't use this function yourself.
-
-
- ΓòÉΓòÉΓòÉ 19.3. Input Functions ΓòÉΓòÉΓòÉ
-
- This section describes the Lisp functions and variables that pertain to
- reading.
-
- In the functions below, stream stands for an input stream (see the previous
- section). If stream is nil or omitted, it defaults to the value of
- standard-input.
-
- An end-of-file error will result if an unterminated list or vector is found.
-
- -- Function: read &optional stream
- This function reads one textual Lisp expression from stream, returning it as a
- Lisp object. This is the basic Lisp input function.
-
- -- Function: read-from-string string &optional start end
- This function reads the first textual Lisp expression from the text in string.
- It returns a cons cell whose car is that expression, and whose cdr is an
- integer giving the position of the next remaining character in the string
- (i.e., the first one not read).
-
- If start is supplied, then reading begins at index start in the string (where
- the first character is at index 0). If end is also supplied, then reading
- stops at that index as if the rest of the string were not there.
-
- For example:
-
- (read-from-string "(setq x 55) (setq y 5)")
- => ((setq x 55) . 11)
- (read-from-string "\"A short string\"")
- => ("A short string" . 16)
-
- ;; Read starting at the first character.
- (read-from-string "(list 112)" 0)
- => ((list 112) . 10)
- ;; Read starting at the second character.
- (read-from-string "(list 112)" 1)
- => (list . 6)
- ;; Read starting at the seventh character, and stopping at the ninth.
- (read-from-string "(list 112)" 6 8)
- => (11 . 8)
-
- -- Variable: standard-input
- This variable holds the default input stream: the stream that read uses when
- the stream argument is nil.
-
-
- ΓòÉΓòÉΓòÉ 19.4. Output Streams ΓòÉΓòÉΓòÉ
-
- An output stream specifies what to do with the characters produced by
- printing. Most print functions accept an output stream as an optional
- argument. Here are the possible types of output stream:
-
- buffer
- The output characters are inserted into buffer at point. Point
- advances as characters are inserted.
-
- marker
- The output characters are inserted into the buffer that marker is in
- at the marker position. The position advances as characters are
- inserted. The value of point in the buffer has no effect when the
- stream is a marker.
-
- function
- The output characters are passed to function, which is responsible
- for storing them away. It is called with a single character as
- argument, as many times as there are characters to be output, and is
- free to do anything at all with the characters it receives.
-
- t
- The output characters are displayed in the echo area.
-
- nil
- nil specified as an output stream means that the value of
- standard-output should be used as the output stream; that value is
- the default output stream, and must be a non-nil output stream.
-
- Here is an example of a buffer used as an output stream. Point is initially
- located as shown immediately before the `h' in `the'. At the end, point is
- located directly before that same `h'.
-
- ---------- Buffer: foo ----------
- This is t-!-he contents of foo.
- ---------- Buffer: foo ----------
-
- (print "This is the output" (get-buffer "foo"))
- => "This is the output"
-
- ---------- Buffer: foo ----------
- This is t
- "This is the output"
- -!-he contents of foo.
- ---------- Buffer: foo ----------
-
- Now we show a use of a marker as an output stream. Initially, the marker
- points in buffer foo, between the `t' and the `h' in the word `the'. At the
- end, the marker has been advanced over the inserted text so that it still
- points before the same `h'. Note that the location of point, shown in the
- usual fashion, has no effect.
-
- ---------- Buffer: foo ----------
- "This is the -!-output"
- ---------- Buffer: foo ----------
-
- m
- => #<marker at 11 in foo>
-
- (print "More output for foo." marker)
- => "More output for foo."
-
- ---------- Buffer: foo ----------
- "This is t
- "More output for foo."
- he -!-output"
- ---------- Buffer: foo ----------
-
- m
- => #<marker at 35 in foo>
-
- The following example shows output to the echo area:
-
- (print "Echo Area output" t)
- => "Echo Area output"
- ---------- Echo Area ----------
- "Echo Area output"
- ---------- Echo Area ----------
-
- Finally, we show an output stream which is a function. The function
- eat-output takes each character that it is given and conses it onto the front
- of the list last-output (see Building Lists). At the end, the list contains all
- the characters output, but in reverse order.
-
- (setq last-output nil)
- => nil
-
- (defun eat-output (c)
- (setq last-output (cons c last-output)))
- => eat-output
-
- (print "This is the output" 'eat-output)
- => "This is the output"
-
- last-output
- => (10 34 116 117 112 116 117 111 32 101 104 116 32 115 105
- 32 115 105 104 84 34 10)
-
- Now we can put the output in the proper order by reversing the list:
-
- (concat (nreverse last-output))
- => "
- \"This is the output\"
- "
-
-
- ΓòÉΓòÉΓòÉ 19.4.1. Output Functions ΓòÉΓòÉΓòÉ
-
- This section describes the Lisp functions and variables that pertain to
- printing.
-
- Some of the Emacs printing functions add quoting characters to the output when
- necessary so that it can be read properly. The quoting characters used are `\'
- and `"'; they are used to distinguish strings from symbols, and to prevent
- punctuation characters in strings and symbols from being taken as delimiters.
- See Printed Representation, for full details. You specify quoting or no
- quoting by the choice of printing function.
-
- If the text is to be read back into Lisp, then it is best to print with
- quoting characters to avoid ambiguity. Likewise, if the purpose is to describe
- a Lisp object clearly for a Lisp programmer. However, if the purpose of the
- output is to look nice for humans, then it is better to print without quoting.
-
- In the functions below, stream stands for an output stream. (See the previous
- section for a description of output streams.) If stream is nil or omitted, it
- defaults to the value of standard-output.
-
- -- Function: print object &optional stream
- The print is a convenient way of printing. It outputs the printed
- representation of object to stream, printing in addition one newline before
- object and another after it. Quoting characters are used. print returns
- object. For example:
-
- (progn (print 'The\ cat\ in)
- (print "the hat")
- (print " came back"))
- -|
- -| The\ cat\ in
- -|
- -| "the hat"
- -|
- -| " came back"
- -|
- => " came back"
-
- -- Function: prin1 object &optional stream
- This function outputs the printed representation of object to stream. It does
- not print any spaces or newlines to separate output as print does, but it does
- use quoting characters just like print. It returns object.
-
- (progn (prin1 'The\ cat\ in)
- (prin1 "the hat")
- (prin1 " came back"))
- -| The\ cat\ in"the hat"" came back"
- => " came back"
-
- -- Function: prin1-to-string object
- This function returns a string containing the text that prin1 would have
- printed for the same argument.
-
- (prin1-to-string 'foo)
- => "foo"
- (prin1-to-string (mark-marker))
- => "#<marker at 2773 in strings.texi>"
-
- See format, in String Conversion, for other ways to obtain the printed
- representation of a Lisp object as a string.
-
- -- Function: princ object &optional stream
- This function outputs the printed representation of object to stream. It
- returns object.
-
- This function is intended to produce output that is readable by people, not by
- read, so quoting characters are not used and double-quotes are not printed
- around the contents of strings. It does not add any spacing between calls.
-
- (progn
- (princ 'The\ cat)
- (princ " in the \"hat\""))
- -| The cat in the "hat"
- => " in the \"hat\""
-
- -- Function: terpri &optional stream
- This function outputs a newline to stream. The name stands for ``terminate
- print''.
-
- -- Variable: standard-output
- The value of this variable is the default output stream, used when the stream
- argument is omitted or nil.
-
- -- Variable: print-escape-newlines
- If this variable is non-nil, then newline characters in strings are printed as
- `\n'. Normally they are printed as actual newlines.
-
- This variable affects the print functions prin1 and print; it does not affect
- princ in Emacs 18, but this may be changed. Here is an example using prin1:
-
- (prin1 "a\nb")
- -| "a
- -| b"
- => "a
- => b"
-
- (let ((print-escape-newlines t))
- (prin1 "a\nb"))
- -| "a\nb"
- => "a
- => b"
-
- In the second expression, the local binding of print-escape-newlines is in
- effect during the call to prin1, but not during the printing of the result.
-
- -- Variable: print-length
- The value of this variable is the maximum number of elements of a list that
- will be printed. If the list being printed has more than this many elements,
- then it is abbreviated with an ellipsis.
-
- If the value is nil (the default), then there is no limit.
-
- (setq print-length 2)
- => 2
- (print '(1 2 3 4 5))
- -| (1 2 ...)
- => (1 2 ...)
-
- -- Function: write-char character &optional stream
- This function outputs character to stream. It returns character.
-
-
- ΓòÉΓòÉΓòÉ 20. Minibuffers ΓòÉΓòÉΓòÉ
-
- A minibuffer is a special buffer used by Emacs commands to read arguments more
- complicated than the single numeric prefix argument. These arguments include
- file names, buffer names, and command names (as in M-x). The minibuffer is
- displayed on the bottom line of the screen, in the same place as the echo area,
- but only while it is in use for reading an argument.
-
-
- ΓòÉΓòÉΓòÉ 20.1. Introduction to Minibuffers ΓòÉΓòÉΓòÉ
-
- In most ways, a minibuffer is a normal Emacs buffer. Most operations within a
- buffer, such as editing commands, work normally in a minibuffer. However, many
- operations for managing buffers do not apply to minibuffers. The name of a
- minibuffer always has the form ` *Minibuf-number', and it cannot be changed.
- There is a special window used only for minibuffers, and minibuffers cannot be
- displayed in any other window. This window is normally the single line at the
- bottom of the screen; it can be resized temporarily with the window sizing
- commands, but reverts to its normal size when the minibuffer is exited.
-
- A recursive minibuffer may be created when there is an active minibuffer and a
- command is invoked that requires input from a minibuffer. The first minibuffer
- is named `*Minibuf-0*'. Recursive minibuffers are named by incrementing the
- number at the end of the name. (The names begin with a space so that they
- won't show up in normal buffer lists.) Of several recursive minibuffers, the
- innermost (or most recently entered) is the active minibuffer, and is the only
- one that is displayed in a window. We usually call this ``the'' minibuffer.
- Recursive minibuffers may be allowed or disallowed by setting the variable
- enable-recursive-minibuffers.
-
- Like other buffers, a minibuffer may use any of several local keymaps (see
- Keymaps); these contain various exit commands and in some cases completion
- commands. See Completion.
-
- o minibuffer-local-map is for ordinary input (no completion).
-
- o minibuffer-local-ns-map is similar, except that SPC exits just like RET.
- This is used mainly for Mocklisp compatibility.
-
- o minibuffer-local-completion-map is for permissive completion.
-
- o minibuffer-local-must-match-map is for strict completion and for cautious
- completion.
-
- o repeat-complex-command-map is for use in C-x ESC.
-
-
- ΓòÉΓòÉΓòÉ 20.2. Reading Text Strings with the Minibuffer ΓòÉΓòÉΓòÉ
-
- The minibuffer is usually used to read text which is returned as a string, but
- can also be used to read a Lisp object in textual form. The most basic
- primitive for minibuffer input is read-from-minibuffer.
-
- -- Function: read-from-minibuffer prompt-string &optional initial keymap read
- This function is the most general way to get input through the minibuffer. By
- default, it accepts arbitrary text and returns it as a string; however, if read
- is non-nil, then it uses read to convert the text into a Lisp object ( see
- Input Functions).
-
- The first thing this function does is to activate a minibuffer and display it
- with prompt-string as the prompt. This value must be a string.
-
- Then, if initial is non-nil, it must be a string; its contents are inserted
- into the minibuffer as initial contents. The text thus inserted is treated as
- if the user had inserted it; the user can alter it with Emacs editing commands.
-
- If keymap is non-nil, that keymap is the local keymap to use while reading. If
- keymap is omitted or nil, the value of minibuffer-local-map is used as the
- keymap. Specifying a keymap is the most important way to customize minibuffer
- input for various applications including completion.
-
- When the user types a command to exit the minibuffer, the current minibuffer
- contents are usually made into a string which is the value of
- read-from-minibuffer. However, if read is non-nil, Emacs converts the result
- to a Lisp object and read-from-minibuffer returns that object, unevaluated.
-
- Suppose, for example, you are writing a search command and want to record the
- last search string and provide it as a default for the next search. Suppose
- that the previous search string is stored in the variable last-search-string.
- Here is how you can read a search string while providing the previous string as
- initial input to be edited:
-
- (read-from-minibuffer "Find string: " last-search-string)
-
- Assuming the value of last-search-string is `No', and the user wants to search
- for `Nope', the interaction looks like this:
-
- (setq last-search-string "No")
-
- (read-from-minibuffer "Find string: " last-search-string)
- ---------- Buffer: Minibuffer ----------
- Find string: No-!-
- ---------- Buffer: Minibuffer ----------
- ;; The user now types pe RET:
- => "Nope"
-
- -- Function: read-string prompt &optional initial
- This function reads a string from the minibuffer and returns it. The arguments
- prompt and initial are used as in read-from-minibuffer.
-
- This function is a simplified interface to read-from-minibuffer:
-
- (read-string prompt initial)
- ==
- (read-from-minibuffer prompt initial nil nil)
-
- -- Variable: minibuffer-local-map
- This is the default local keymap for reading from the minibuffer. It is the
- keymap used by the minibuffer for local bindings in the function read-string.
- By default, it makes the following bindings:
-
- LFD
- exit-minibuffer
-
- RET
- exit-minibuffer
-
- C-g
- abort-recursive-edit
-
- -- Function: read-no-blanks-input prompt initial
- This function reads a string from the minibuffer, but does not allow whitespace
- characters as part of the input: instead, those characters terminate the input.
- The arguments prompt and initial are used as in read-from-minibuffer.
-
- This function is a simplified interface to read-from-minibuffer, and passes the
- value of minibuffer-local-ns-map as the keymap argument for that function.
- Since the keymap minibuffer-local-ns-map does not rebind C-q, it is possible to
- put a space into the string, by quoting it.
-
- (read-no-blanks-input prompt initial)
- ==
- (read-from-minibuffer prompt initial minibuffer-local-ns-map)
-
- -- Variable: minibuffer-local-ns-map
- This built-in variable is the keymap used as the minibuffer local keymap in the
- function read-no-blanks-input. By default, it makes the following bindings:
-
- LFD
- exit-minibuffer
-
- SPC
- exit-minibuffer
-
- TAB
- exit-minibuffer
-
- RET
- exit-minibuffer
-
- C-g
- abort-recursive-edit
-
- ?
- self-insert-and-exit
-
-
- ΓòÉΓòÉΓòÉ 20.3. Reading Lisp Objects with the Minibuffer ΓòÉΓòÉΓòÉ
-
- This section describes functions for reading Lisp objects with the minibuffer.
-
- -- Function: read-minibuffer prompt &optional initial
- This function reads a Lisp object in the minibuffer and returns it,
- unevaluated. The arguments prompt and initial are used as in
- read-from-minibuffer; in particular, initial must be a string or nil.
-
- This function is a simplified interface to read-from-minibuffer:
-
- (read-minibuffer prompt initial)
- ==
- (read-from-minibuffer prompt initial nil t)
-
- Here is an example in which we supply the string "(testing)" as initial input:
-
- (read-minibuffer "Enter an expression: " (format "%s" '(testing)))
-
- ;; Here is how the minibuffer is displayed:
-
- ---------- Buffer: Minibuffer ----------
- Enter an expression: (testing)-!-
- ---------- Buffer: Minibuffer ----------
-
- The user can type RET immediately to use the initial input as a default, or can
- edit the input.
-
- -- Function: eval-minibuffer prompt &optional initial
- This function reads a Lisp expression in the minibuffer, evaluates it, then
- returns the result. The arguments prompt and initial are used as in
- read-from-minibuffer.
-
- This function simply evaluates the result of a call to read-minibuffer:
-
- (eval-minibuffer prompt initial)
- ==
- (eval (read-minibuffer prompt initial))
-
- -- Function: edit-and-eval-command prompt form
- This function reads a Lisp expression in the minibuffer, and then evaluates
- it. The difference between this command and eval-minibuffer is that here the
- initial form is not optional and it is treated as a Lisp object to be converted
- to printed representation rather than as a string of text. It is printed with
- prin1, so if it is a string, double-quote characters (`"') will appear in the
- initial text. See Output Functions.
-
- The first thing edit-and-eval-command does is to activate the minibuffer with
- prompt as the prompt. The printed representation of form is then inserted in
- the minibuffer, and the user is allowed to edit. When the user exits the
- minibuffer, the edited text is read with read and then evaluated. The
- resulting value becomes the value of edit-and-eval-command.
-
- In the following example, we offer the user an expression with initial text
- which is a valid form already:
-
- (edit-and-eval-command "Please edit: " '(forward-word 1))
-
- ;; After evaluating the preceding expression,
- ;; the following appears in the minibuffer:
-
- ---------- Buffer: Minibuffer ----------
- Please edit: (forward-word 1)-!-
- ---------- Buffer: Minibuffer ----------
-
- Typing RET right away would exit the minibuffer and evaluate the expression,
- thus moving point forward one word. edit-and-eval-command returns nil in this
- example.
-
-
- ΓòÉΓòÉΓòÉ 20.4. Completion ΓòÉΓòÉΓòÉ
-
- Completion is a feature that fills in the rest of a name starting from an
- abbreviation for it. Completion works by comparing the user's input against a
- list of valid names and determining how much of the name is determined uniquely
- by what the user has typed.
-
- For example, when you type C-x b (switch-to-buffer) and then type the first
- few letters of the name of the buffer to which you wish to switch, and then
- type TAB (minibuffer-complete), Emacs extends the name as far as it can.
- Standard Emacs commands offer completion for names of symbols, files, buffers,
- and processes; with the functions in this section, you can implement completion
- for other kinds of names.
-
- The try-completion function is the basic primitive for completion: it returns
- the longest determined completion of a given initial string, with a given set
- of strings to match against.
-
- The function completing-read provides a higher-level interface for completion.
- A call to completing-read specifies how to determine the list of valid names.
- The function then activates the minibuffer with a local keymap that binds a few
- keys to commands useful for completion. Other functions provide convenient
- simple interfaces for reading certain kinds of names with completion.
-
-
- ΓòÉΓòÉΓòÉ 20.4.1. Basic Completion Functions ΓòÉΓòÉΓòÉ
-
- -- Function: try-completion string alist-or-obarray &optional predicate
- This function returns the longest common substring of all possible completions
- of string in alist-or-obarray.
-
- If alist-or-obarray is an association list ( see Association Lists), the car
- of each cons cell in it is compared against string; if the beginning of the car
- equals string, the cons cell matches. If no cons cells match, try-completion
- returns nil. If only one cons cell matches, and the match is exact, then
- try-completion returns t. Otherwise, all matching strings are compared, and
- the longest initial sequence common to them is returned as a string.
-
- If alist-or-obarray is an obarray (see Creating Symbols), the names of all
- symbols in the obarray form the space of possible names. They are tested and
- used just like the cars of the elements of an association list. (The global
- variable obarray holds an obarray containing the names of all interned Lisp
- symbols.)
-
- If the argument predicate is non-nil, then it must be a function of one
- argument. It is used to test each possible match, and the match is accepted
- only if predicate returns non-nil. The argument given to predicate is either a
- cons cell from the alist (the car of which is a string) or else it is a symbol
- (not a symbol name) from the obarray.
-
- It is also possible to use a function as alist-or-obarray. Then the function
- is solely responsible for performing completion; try-completion returns
- whatever this function returns. The function is called with three arguments:
- string, predicate and nil. (The reason for the third argument is so that the
- same function can be used in all-completions and do the appropriate thing in
- either case.) See Programmed Completion.
-
- In the first of the following examples, the string `foo' is matched by three
- of the alist cars. All of the matches begin with the characters `fooba', so
- that is the result. In the second example, there is only one possible match,
- and it is exact, so the value is t.
-
- (try-completion "foo"
- '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4)))
- => "fooba"
-
- (try-completion "foo" '(("barfoo" 2) ("foo" 3)))
- => t
-
- In the following example, numerous symbols begin with the characters `forw',
- and all of them begin with the word `forward'. In most of the symbols, this is
- followed with a `-', but not in all, so no more than `forward' can be
- completed.
-
- (try-completion "forw" obarray)
- => "forward"
-
- Finally, in the following example, only two of the three possible matches pass
- the predicate test (the string `foobaz' is too short). Both of those begin
- with the string `foobar'.
-
- (defun test (s)
- (> (length (car s)) 6))
- => test
- (try-completion "foo"
- '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4))
- 'test)
- => "foobar"
-
- -- Function: all-completions string alist-or-obarray &optional predicate
- This function returns a list of all possible completions, instead of the
- longest substring they share. The parameters to this function are the same as
- to try-completion.
-
- If alist-or-obarray is a function, it is called with three arguments: string,
- predicate and t, and all-completions returns whatever the function returns. See
- Programmed Completion.
-
- Here is an example, using the same function test used in the example for
- try-completion:
-
- (defun test (s)
- (> (length (car s)) 6))
- => test
-
- (all-completions "foo"
- '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4))
- (function test))
- => ("foobar1" "foobar2")
-
- -- Variable: completion-ignore-case
- If the value of this variable is non-nil, Emacs does not consider case
- significant in completion.
-
- The two functions try-completion and all-completions have nothing in
- themselves to do with minibuffers. However, completion is most often used
- there, which is why it is described in this chapter.
-
-
- ΓòÉΓòÉΓòÉ 20.4.2. Programmed Completion ΓòÉΓòÉΓòÉ
-
- Sometimes it is not possible to create an alist or an obarray containing all
- the intended possible completions. In such a case, you can supply your own
- function to compute the completion of a given string. This is called programmed
- completion.
-
- To use this feature, pass the function as the alist-or-obarray argument to
- completing-read. This command will arrange to pass the function along to
- try-completion and all-completions, which will then let your function do all
- the work.
-
- The completion function should accept three arguments:
-
- o The string to be completed.
-
- o The predicate function to filter possible matches, or nil if none. Your
- function should call the predicale for each possible match and ignore the
- possible match if the predicate returns nil.
-
- o A flag specifying the type of operation.
-
- There are three flag values for three operations:
-
- o nil specifies try-completion. The completion function should return the
- completion of the specified string, or t if the string is an exact match
- already, or nil if the string matches no possibility.
-
- o t specifies all-completions. The completion function should return a list of
- all possible completions of the specified string.
-
- o lambda specifies a test for an exact match. The completion function should
- return t if the specified string is an exact match for some possibility; nil
- otherwise.
-
- Emacs uses programmed completion when completing file names. See File Name
- Completion.
-
-
- ΓòÉΓòÉΓòÉ 20.4.3. Completion and the Minibuffer ΓòÉΓòÉΓòÉ
-
- This section describes the basic interface for reading from the minibuffer
- with completion.
-
- -- Function: completing-read prompt alist-or-obarray &optional predicate
- require-match initial
- This function reads a string in the minibuffer, assisting the user by
- providing completion. It activates the minibuffer with prompt prompt, which
- must be a string. If initial is non-nil, completing-read inserts it into the
- minibuffer as part of the input. Then it allows the user to edit the input,
- providing several commands to attempt completion.
-
- The actual completion is done by passing alist-or-obarray and predicate to the
- function try-completion. This happens in certain commands bound in the local
- keymaps used for completion.
-
- If require-match is t, the user will not be allowed to exit unless the input
- completes to an element of alist-or-obarray. If require-match is neither nil
- nor t, then completing-read does not exit unless the input typed is itself an
- element of alist-or-obarray. To accomplish this, completing-read calls
- read-minibuffer with the keymap minibuffer-local-completion-map if
- require-match is nil, or else with the keymap minibuffer-local-must-match-map,
- if require-match is non-nil.
-
- Case is ignored when comparing the input against the possible matches if the
- built-in variable completion-ignore-case is non-nil. See Basic Completion.
-
- For example:
-
- (completing-read "Complete a foo: "
- '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4))
- nil t "fo")
-
- ;; After evaluating the preceding expression,
- ;; the following appears in the minibuffer:
-
- ---------- Buffer: Minibuffer ----------
- Complete a foo: fo-!-
- ---------- Buffer: Minibuffer ----------
-
- If the user then types DEL DEL b RET, completing-read returns barfoo.
-
- The completing-read function binds three variables to pass information to the
- commands which actually do completion. Here they are:
-
- minibuffer-completion-table
- This variable is bound to alist-or-obarray argument. It is passed to
- the try-completion function.
-
- minibuffer-completion-predicate
- This variable is bound to the predicate argument. It is passed to
- the try-completion function.
-
- minibuffer-completion-confirm
- This variable is bound to the require-match argument. It is used in
- the minibuffer-complete-and-exit function.
-
-
- ΓòÉΓòÉΓòÉ 20.4.4. Minibuffer Commands That Do Completion ΓòÉΓòÉΓòÉ
-
- This section describes the keymaps, commands and user options used in the
- minibuffer to do completion.
-
- -- Variable: minibuffer-local-completion-map
- completing-read uses this value as the local keymap when an exact match of one
- of the completions is not required. By default, this keymap makes the
- following bindings:
-
- ?
- minibuffer-completion-help
-
- SPC
- minibuffer-complete-word
-
- TAB
- minibuffer-complete
-
- LFD
- exit-minibuffer
-
- RET
- exit-minibuffer
-
- C-g
- abort-recursive-edit
-
- -- Variable: minibuffer-local-must-match-map
- completing-read uses this value as the local keymap when an exact match of one
- of the completions is required. Therefore, no keys are bound to
- exit-minibuffer, the command which exits the minibuffer unconditionally. By
- default, this keymap makes the following bindings:
-
- ?
- minibuffer-completion-help
-
- SPC
- minibuffer-complete-word
-
- TAB
- minibuffer-complete
-
- LFD
- minibuffer-complete-and-exit
-
- RET
- minibuffer-complete-and-exit
-
- C-g
- abort-recursive-edit
-
- -- Variable: minibuffer-completion-table
- The value of this variable is the alist or obarray used for completion in the
- minibuffer. This is the global variable that contains what completing-read
- passes to try-completion. It is used by all the minibuffer completion
- functions, such as minibuffer-complete-word.
-
- -- Variable: minibuffer-completion-predicate
- The value of this variable is the predicate that completing-read passes to
- try-completion. The variable is also used by the other minibuffer completion
- functions.
-
- -- Command: minibuffer-complete-word
- This function completes the minibuffer contents by at most a single word.
- Even if the minibuffer contents has only one completion,
- minibuffer-complete-word will not add any characters beyond the first character
- that is not a word constituent. See Syntax Tables.
-
- -- Command: minibuffer-complete
- This function completes the minibuffer contents as far as possible.
-
- -- Command: minibuffer-complete-and-exit
- This function completes the minibuffer contents, and exits if confirmation is
- not required, i.e., if minibuffer-completion-confirm is non-nil. If
- confirmation is required, it is given by repeating this command immediately.
-
- -- Variable: minibuffer-completion-confirm
- When the value of this variable is non-nil, Emacs asks for confirmation of a
- completion before exiting the minibuffer. The function
- minibuffer-complete-and-exit checks the value of this variable before it exits.
-
- -- Command: minibuffer-completion-help
- This function creates a list of the possible completions of the current
- minibuffer contents. It works by calling all-completions; the values of
- minibuffer-completion-table and minibuffer-completion-predicate are used as
- arguments. The list of completions is displayed as text in a buffer named
- `*Completions*'.
-
- -- Function: display-completion-list completions
- This function displays completions to the stream standard-output (usually a
- buffer). (See Streams, for more information about streams.) The argument
- completions is normally a list of completions just returned by all-completions,
- but it does not have to be. Each element may be a symbol or a string, either
- of which is simply printed, or a list of two strings, which is printed as if
- the strings were concatenated.
-
- This function is called by minibuffer-completion-help.
-
- -- User Option: completion-auto-help
- If this variable is non-nil, the completion commands automatically display a
- list of possible completions whenever nothing can be completed because the next
- character is not uniquely determined.
-
-
- ΓòÉΓòÉΓòÉ 20.4.5. High-Level Completion Functions ΓòÉΓòÉΓòÉ
-
- This section describes the higher-level convenient functions for reading
- certain sorts of names with completion.
-
- -- Function: read-buffer prompt &optional default existing
- This function reads the name of a buffer and returns it as a string. The
- argument default is the default name to use, the value to return if the user
- exits with an empty minibuffer. If non-nil, it should be a string. It is
- mentioned in the prompt, but is not inserted in the minibuffer as initial
- input.
-
- If existing is non-nil, then the name specified must be that of an existing
- buffer. The usual commands to exit the minibuffer will not exit if the text is
- not valid, and RET will do completion to attempt to find a valid name.
- (However, default is not checked for this; it is returned, whatever it is, if
- the user exits with the minibuffer empty.)
-
- In the following example, the user enters `minibuffer.t', and then types RET.
- The argument existing is t, and the only buffer name starting with the given
- input is `minibuffer.texi', so that name is the value.
-
- (read-buffer "Buffer name? " "foo" t)
-
- ;; After evaluating the preceding expression,
- ;; the following prompt appears, with an empty minibuffer:
-
- ---------- Buffer: Minibuffer ----------
- Buffer name? (default foo) -!-
- ---------- Buffer: Minibuffer ----------
-
- ;; The user types minibuffer.t RET.
-
- => "minibuffer.texi"
-
- -- Function: read-command prompt
- This function reads the name of a command and returns it as a Lisp symbol.
- The argument prompt is used as in read-from-minibuffer. Recall that a command
- is anything for which commandp returns t, and a command name is a symbol for
- which commandp returns t. See Interactive Call.
-
- (read-command "Command name? ")
-
- ;; After evaluating the preceding expression,
- ;; the following appears in the minibuffer:
-
- ---------- Buffer: Minibuffer ----------
- Command name?
- ---------- Buffer: Minibuffer ----------
-
- If the user types forward-c RET, then this function returns forward-char.
-
- The read-command function is a simplified interface to completing-read. It
- uses the commandp predicate to allow only commands to be entered, and it uses
- the variable obarray so as to be able to complete all extant Lisp symbols:
-
- (read-command prompt)
- ==
- (intern (completing-read prompt obarray 'commandp t nil))
-
- -- Function: read-variable prompt
- This function reads the name of a user variable and returns it as a symbol.
-
- (read-variable "Variable name? ")
-
- ;; After evaluating the preceding expression,
- ;; the following prompt appears with an empty minibuffer:
-
- ---------- Buffer: Minibuffer ----------
- Variable name? -!-
- ---------- Buffer: Minibuffer ----------
-
- If the user then types fill-p RET, read-variable will return fill-prefix.
-
- This function is similar to read-command, but uses the predicate
- user-variable-p instead of commandp:
-
- (read-variable prompt)
- ==
- (intern (completing-read prompt obarray 'user-variable-p t nil))
-
-
- ΓòÉΓòÉΓòÉ 20.4.6. Reading File Names ΓòÉΓòÉΓòÉ
-
- Here is another high-level completion function, designed for reading a file
- name. It provides special features including automatic insertion of the
- default directory.
-
- -- Function: read-file-name prompt &optional directory default existing
- This function reads a file name in the minibuffer, prompting with prompt and
- providing completion. If default is non-nil, then the value of default will be
- returned by the function if the user just types RET.
-
- If existing is non-nil, then the name must refer to an existing file; then RET
- performs completion to make the name valid if possible, and then refuses to
- exit if it is not valid. If the value of existing is neither nil nor t, then
- RET also requires confirmation after completion.
-
- The argument directory specifies the directory to use for completion of
- relative file names. Usually it is inserted in the minibuffer as initial input
- as well. It defaults to the current buffer's default directory.
-
- Here is an example:
-
- (read-file-name "The file is ")
-
- ;; After evaluating the preceding expression,
- ;; the following appears in the minibuffer:
-
- ---------- Buffer: Minibuffer ----------
- The file is /gp/gnu/elisp/-!-
- ---------- Buffer: Minibuffer ----------
-
- Typing manual TAB results in the following:
-
- ---------- Buffer: Minibuffer ----------
- The file is /gp/gnu/elisp/manual.texi-!-
- ---------- Buffer: Minibuffer ----------
-
- If the user types RET, read-file-name returns "/gp/gnu/elisp/manual.texi".
-
- -- User Option: insert-default-directory
- This variable is used by read-file-name. The value of this variable controls
- whether read-file-name starts by placing the name of the default directory in
- the minibuffer. If the value of this variable is nil, then read-file-name does
- not place any initial input in the minibuffer. In that case, the default
- directory is still used for completion of relative file names, but is not
- displayed.
-
- For example:
-
- ;; Here the minibuffer starts out containing the default directory.
-
- (let ((insert-default-directory t))
- (read-file-name "The file is "))
-
- ---------- Buffer: Minibuffer ----------
- The file is ~lewis/manual/-!-
- ---------- Buffer: Minibuffer ----------
-
- ;; Here the minibuffer is empty and only the prompt appears on its line.
-
- (let ((insert-default-directory nil))
- (read-file-name "The file is "))
-
- ---------- Buffer: Minibuffer ----------
- The file is -!-
- ---------- Buffer: Minibuffer ----------
-
-
- ΓòÉΓòÉΓòÉ 20.4.7. Lisp Symbol Completion ΓòÉΓòÉΓòÉ
-
- If you type a part of a symbol, and then type M-TAB (lisp-complete-symbol), it
- will attempt to fill in as much more of the symbol name as it can. Not only
- does this save typing, but it can help you with the name of a symbol that you
- have partially forgotten.
-
- -- Command: lisp-complete-symbol
- This function performs completion on the symbol name preceding point. The name
- is completed against the symbols in the global variable obarray, and characters
- from the completion are inserted into the buffer, making the name longer. If
- there is more than one completion, a list of all possible completions is placed
- in the `*Help*' buffer. The bell rings if there is no possible completion in
- obarray.
-
- If an open parenthesis immediately precedes the name, only symbols with
- function definitions are considered. (By reducing the number of alternatives,
- this may succeed in completing more characters.) Otherwise, symbols with either
- a function definition, a value, or at least one property are considered.
-
- lisp-complete-symbol returns t if the symbol had an exact, and unique, match;
- otherwise, it returns nil.
-
- In the following example, the user has already inserted `(forwa' into the
- buffer `foo.el'. The command lisp-complete-symbol then completes the name to
- `(forward-'.
-
- ---------- Buffer: foo.el ----------
- (forwa-!-
- ---------- Buffer: foo.el ----------
-
- (lisp-complete-symbol)
- => nil
-
- ---------- Buffer: foo.el ----------
- (forward--!-
- ---------- Buffer: foo.el ----------
-
-
- ΓòÉΓòÉΓòÉ 20.5. Yes-or-No Queries ΓòÉΓòÉΓòÉ
-
- This section describes functions used to ask the user a yes-or-no question.
- The function y-or-n-p can be answered with a single character; it is useful for
- questions where an inadvertent wrong answer will not have serious consequences.
- yes-or-no-p is suitable for more momentous questions, since it requires three
- or four characters to answer.
-
- Strictly speaking, yes-or-no-p uses the minibuffer and y-or-n-p does not; but
- it seems best to describe them together.
-
- -- Function: y-or-n-p prompt
- This function asks the user a question, expecting input in the echo area. It
- returns t if the user types y, nil if the user types n. This function also
- accepts SPC to mean yes and DEL to mean no. The answer is a single character,
- with no RET needed to terminate it. Upper and lower case are equivalent.
-
- ``Asking the question'' means printing prompt in the echo area, followed by
- the string `(y or n) '. If the input is not one of the expected answers (y, n,
- SPC, or DEL), the function responds `Please answer y or n.', and repeats the
- request.
-
- This function does not actually use the minibuffer, since it does not allow
- editing of the answer. It actually uses the echo area ( see The Echo Area),
- which uses the same screen space as the minibuffer. The cursor moves to the
- echo area while the question is being asked.
-
- In the following example, the user first types q, which is invalid. At the
- next prompt the user types n.
-
- (y-or-n-p "Do you need a lift? ")
-
- ;; After evaluating the preceding expression,
- ;; the following prompt appears in the echo area:
-
- ---------- Echo area ----------
- Do you need a lift? (y or n)
- ---------- Echo area ----------
-
- ;; If the user then types q, the following appears:
-
- ---------- Echo area ----------
- Please answer y or n. Do you need a lift? (y or n)
- ---------- Echo area ----------
-
- ;; When the user types a valid answer, it is displayed after the question:
-
- ---------- Echo area ----------
- Do you need a lift? (y or n) y
- ---------- Echo area ----------
-
- Note that we show successive lines of echo area messages here. Only one will
- appear on the screen at a time.
-
- -- Function: yes-or-no-p prompt
- This function asks the user a question, expecting input in minibuffer. It
- returns t if the user enters `yes', nil if the user types `no'. The user must
- type RET to finalize the response. Upper and lower case are equivalent.
-
- yes-or-no-p starts by displaying prompt in the echo area, followed by `(yes or
- no) '. The user must type one of the expected responses; otherwise, the
- function responds `Please answer yes or no.', waits about two seconds and
- repeats the request.
-
- yes-or-no-p requires more work from the user than y-or-n-p and is appropriate
- for more crucial decisions.
-
- Here is an example:
-
- (yes-or-no-p "Do you really want to remove your entire directory? ")
-
- ;; After evaluating the preceding expression,
- ;; the following prompt appears with an empty minibuffer:
-
- ---------- Buffer: minibuffer ----------
- Do you really want to remove your entire directory? (yes or no)
- ---------- Buffer: minibuffer ----------
-
- If the user first types y RET, which is invalid because this function demands
- the entire word `yes', it responds by displaying these prompts, with a brief
- pause between them:
-
- ---------- Buffer: minibuffer ----------
- Please answer yes or no.
- Do you really want to remove your entire directory? (yes or no)
- ---------- Buffer: minibuffer ----------
-
-
- ΓòÉΓòÉΓòÉ 20.6. Minibuffer Miscellany ΓòÉΓòÉΓòÉ
-
- Some basic minibuffer functions and variables are described in this section.
-
- -- Command: exit-minibuffer
- This function exits the active minibuffer. It is normally bound to keys in
- minibuffer local keymaps.
-
- -- Command: self-insert-and-exit
- This function exits the active minibuffer after inserting the last character
- typed on the keyboard (found in last-command-char; see Command Loop Info).
-
- -- Variable: minibuffer-help-form
- The current value of this variable is used to rebind help-form locally inside
- the minibuffer (see Help Functions).
-
- -- Function: minibuffer-window
- This function returns the window that is used for the minibuffer. There is one
- and only one minibuffer window in Emacs 18; this window always exists and
- cannot be deleted.
-
- -- Variable: minibuffer-scroll-window
- If the value of this variable is non-nil, it should be a window object. When
- the function scroll-other-window is called in the minibuffer, it will scroll
- the minibuffer-scroll-window window.
-
- Finally, some functions and variables deal with recursive minibuffers (see
- Recursive Editing):
-
- -- Function: minibuffer-depth
- This function returns the current depth of activations of the minibuffer, a
- nonnegative integer. If no minibuffers are active, it returns zero.
-
- -- User Option: enable-recursive-minibuffers
- If this variable is non-nil, you can invoke commands (such as find-file) which
- use minibuffers even while in the minibuffer window. Such invocation produces
- a recursive editing level for a new minibuffer. The outer-level minibuffer is
- invisible while you are editing the inner one.
-
- This variable only affects invoking the minibuffer while the minibuffer window
- is selected. If you switch windows while in the minibuffer, you can always
- invoke minibuffer commands while some other window is selected.
-
-
- ΓòÉΓòÉΓòÉ 21. Command Loop ΓòÉΓòÉΓòÉ
-
- When you run Emacs, it enters the editor command loop almost immediately.
- This loop reads key sequences, executes their definitions, and displays the
- results. In this chapter, we describe how these things are done, and the
- subroutines that allow Lisp programs to do them.
-
-
- ΓòÉΓòÉΓòÉ 21.1. Command Loop Overview ΓòÉΓòÉΓòÉ
-
- The first thing the command loop must do is read a key sequence, which is a
- sequence of characters that translates into a command. It does this by calling
- the function read-key-sequence. Your Lisp code can also call this function
- (see Keyboard Input). Lisp programs can also do input at a lower level with
- read-char or discard pending input with discard-input.
-
- The key sequence is translated into a command through the keymaps of the
- current buffer. See Keymaps, for information on how this is done. The result
- should be a keyboard macro or an interactively callable function. If the key
- is M-x, then it reads the name of another command, which is used instead. This
- is done by the command execute-extended-command (see Interactive Call).
-
- Once the command is read, it must be executed, which includes reading
- arguments to be given to it. This is done by calling command-execute (see
- Interactive Call). For commands written in Lisp, the interactive specification
- says how to read the arguments. This may use the prefix argument ( see Prefix
- Command Arguments) or may read with prompting in the minibuffer (see
- Minibuffers). For example, the command find-file has an interactive
- specification which says to read a file name using the minibuffer. The
- command's function body does not use the minibuffer; if you call this command
- from Lisp code as a function, you must supply the file name string as an
- ordinary Lisp function argument.
-
- If the command is a string (i.e., a keyboard macro) then the function
- execute-kbd-macro is used to execute it. You can call this function yourself
- (see Keyboard Macros).
-
- If a command runs away, typing C-g will terminate its execution immediately.
- This is called quitting (see Quitting).
-
-
- ΓòÉΓòÉΓòÉ 21.2. Defining Commands ΓòÉΓòÉΓòÉ
-
- A Lisp function becomes a command when its body contains, at top level, a form
- which calls the special form interactive. This form does nothing when actually
- executed, but its presence serves as a flag to indicate that interactive
- calling is permitted. Its argument controls the reading of arguments for an
- interactive call.
-
-
- ΓòÉΓòÉΓòÉ 21.2.1. Using interactive ΓòÉΓòÉΓòÉ
-
- This section describes how to write the interactive form that makes a Lisp
- function an interactively-callable command.
-
- -- Special Form: interactive arg-descriptor
- This special form declares that the function in which it appears is a command,
- and that it may therefore be called interactively (via M-x or by entering a key
- sequence bound to it). The argument arg-descriptor declares the way the
- arguments to the command are to be computed when the command is called
- interactively.
-
- A command may be called from Lisp programs like any other function, but then
- the arguments are supplied by the caller and arg-descriptor has no effect.
-
- The interactive form has its effect because the command loop (actually, its
- subroutine call-interactively) scans through the function definition looking
- for it, before calling the function. Once the function is called, all its body
- forms including the interactive form are executed, but at this time interactive
- simply returns nil without even evaluating its argument.
-
- There are three possibilities for the argument arg-descriptor:
-
- o It may be omitted or nil; then the command is called with no arguments. This
- leads quickly to an error if the command requires one or more arguments.
-
- o It may be a Lisp expression that is not a string; then it should be a form
- that is evaluated to get a list of arguments to pass to the command.
-
- o It may be a string; then its contents should consist of a code character
- followed by a prompt (if required for that code character). The prompt ends
- either with the end of the string or with a newline. Here is a simple
- example:
-
- (interactive "bFrobnicate buffer: ")
-
- The code letter `b' says to read the name of an existing buffer, with
- completion. The buffer name will be the sole argument passed to the command.
- The rest of the string is a prompt.
-
- If there is a newline character in the string, it terminates the prompt. If
- the string does not end there, then the rest of the string should contain
- another code character and prompt, specifying another argument. Any number of
- arguments may be specified in this way.
-
- If the first character in the string is `*', then an error is signaled if the
- buffer is read-only. Otherwise, the following character is the first code
- character.
-
-
- ΓòÉΓòÉΓòÉ 21.2.2. Code Characters for interactive ΓòÉΓòÉΓòÉ
-
- The code character descriptions below contain a number of key words, defined
- here as follows:
-
- Completion
- Provide completion. TAB, SPC, and RET perform name completion
- because the argument is read using completing-read (see Completion).
- ? displays a list of possible completions.
-
- Existing
- Require the name of an existing object. An invalid name is not
- accepted; the commands to exit the minibuffer do not exit if the
- current input is not valid.
-
- Default
- A default value of some sort is used if the user enters no text in
- the minibuffer. The default depends on the code character.
-
- Prompt
- A prompt immediately follows the code character. The prompt ends
- either with the end of the string or with a newline.
-
- No I/O
- This code letter computes an argument without reading any input.
- Therefore, it does not use a prompt string, and any prompt string you
- supply is ignored.
-
- Here are the code character descriptions for use with interactive:
-
- `a'
- A function name (i.e., a symbol which is fboundp). Existing,
- Completion, Prompt.
-
- `b'
- The name of an existing buffer. By default, uses the name of the
- current buffer (see Buffers). Existing, Completion, Default, Prompt.
-
- `B'
- A buffer name. The buffer need not exist. By default, uses the name
- of a recently used buffer other than the current buffer. Completion,
- Prompt.
-
- `c'
- A character. The cursor does not move into the echo area. Prompt.
-
- `C'
- A command name (i.e., a symbol satisfying commandp). Existing,
- Completion, Prompt.
-
- `d'
- The position of point as a number (see Point). No I/O.
-
- `D'
- A directory name. The default is the current default directory of
- the current buffer, default-directory (see System Environment).
- Existing, Completion, Default, Prompt.
-
- `f'
- A file name of an existing file (see File Names). The default
- directory is default-directory. Existing, Completion, Default,
- Prompt.
-
- `F'
- A file name. The file need not exist. Completion, Default, Prompt.
-
- `k'
- A key sequence (see Keymap Terms). This keeps reading characters
- until a command (or undefined command) is found in the current key
- maps. The key sequence argument is represented as a string. The
- cursor does not move into the echo area. Prompt.
-
- This kind of input is used by commands such as describe-key and
- global-set-key.
-
- `m'
- The position of the mark as a number. No I/O.
-
- `n'
- A number read with the minibuffer. If the input is not a number, the
- user is asked to try again. The prefix argument, if any, is not
- used. Prompt.
-
- `N'
- The raw prefix argument. If the prefix argument is nil, then a
- number is read as with n. Requires a number. Prompt.
-
- `p'
- The numeric prefix argument. (Note that this `p' is lower case.) No
- I/O.
-
- `P'
- The raw prefix argument. (Note that this `P' is upper case.) See
- Prefix Command Arguments. No I/O.
-
- `r'
- Point and the mark, as two numeric arguments, smallest first. This
- is the only code letter that specifies two successive arguments
- rather than one. No I/O.
-
- `s'
- Arbitrary text, read in the minibuffer and returned as a string (see
- Text from Minibuffer). Terminate the input with either LFD or RET.
- (C-q may be used to include either of these characters in the input.)
- Prompt.
-
- `S'
- An interned symbol whose name is read in the minibuffer. Any
- whitespace character terminates the input. (Use C-q to include
- whitespace in the string.) Other characters that normally terminate
- a symbol (e.g., parentheses and brackets) do not do so here. Prompt.
-
- `v'
- A variable declared to be a user option (i.e., satisfying
- user-variable-p). See High-Level Completion. Existing, Completion,
- Prompt.
-
- `x'
- A Lisp object specified in printed representation, terminated with a
- LFD or RET. The object is not evaluated. See Object from Minibuffer.
- Prompt.
-
- `X'
- A Lisp form is read as with x, but then evaluated so that its value
- becomes the argument for the command. Prompt.
-
-
- ΓòÉΓòÉΓòÉ 21.2.3. Examples of Using interactive ΓòÉΓòÉΓòÉ
-
- Here are some examples of interactive:
-
- (defun foo1 () ; foo1 takes no arguments,
- (interactive) ; just moves forward two words.
- (forward-word 2))
- => foo1
-
- (defun foo2 (n) ; foo2 takes one argument,
- (interactive "p") ; which is the numeric prefix.
- (forward-word (* 2 n)))
- => foo2
-
- (defun foo3 (n) ; foo3 takes one argument,
- (interactive "nCount:") ; which is read with the Minibuffer.
- (forward-word (* 2 n)))
- => foo3
-
- (defun three-b (b1 b2 b3)
- "Select three existing buffers (prompting for them in
- the Minibuffer). Put them into three windows, selecting the
- last one."
- (interactive "bBuffer1:\nbBuffer2:\nbBuffer3:")
- (delete-other-windows)
- (split-window (selected-window) 8)
- (switch-to-buffer b1)
- (other-window 1)
- (split-window (selected-window) 8)
- (switch-to-buffer b2)
- (other-window 1)
- (switch-to-buffer b3))
- => three-b
- (three-b "*scratch*" "declarations.texi" "*mail*")
- => nil
-
-
- ΓòÉΓòÉΓòÉ 21.3. Interactive Call ΓòÉΓòÉΓòÉ
-
- After the command loop has translated a key sequence into a definition, it
- invokes that definition using the function command-execute. If the definition
- is a function that is a command, command-execute calls call-interactively,
- which reads the arguments and calls the command. You can also call these
- functions yourself.
-
- -- Function: commandp object
- Returns t if object is suitable for calling interactively; that is, if object
- is a command. Otherwise, returns nil.
-
- The interactively callable objects include strings (treated as keyboard
- macros), lambda expressions that contain a top-level call to interactive,
- autoload objects that are declared as interactive (non-nil fourth argument to
- autoload), and some of the primitive functions.
-
- A symbol is commandp if its function definition is commandp.
-
- Keys and keymaps are not commands. Rather, they are used to look up commands
- (see Keymaps).
-
- See documentation in Accessing Documentation, for a realistic example of using
- commandp.
-
- -- Function: call-interactively command &optional record-flag
- This function calls the interactively callable function command, reading
- arguments according to its interactive calling specifications. An error is
- signaled if command cannot be called interactively (i.e., it is not a command).
- Note that strings are not accepted, even though they are considered commands.
-
- If record-flag is non-nil, then this command and its arguments are
- unconditionally added to the list command-history. Otherwise, the command is
- added only if it uses the minibuffer to read an argument. See Command History.
-
- -- Function: command-execute command &optional record-flag
- This function executes command as an editing command. The argument command
- must satisfy the commandp predicate; i.e., it must be an interactively callable
- function or a string.
-
- A string as command is executed with execute-kbd-macro. A function is passed
- to call-interactively, along with the optional record-flag.
-
- A symbol is handled by using its function definition in its place. A symbol
- with an autoload definition counts as a command if it was declared to stand for
- an interactively callable function. Such a definition is handled by loading
- the specified library and then rechecking the definition of the symbol.
-
- -- Command: execute-extended-command prefix-argument
- This primitive function reads a command name from the minibuffer using
- completing-read (see Completion). Then it uses command-execute to call the
- specified command. Whatever that command returns becomes the value of
- execute-extended-command.
-
- If the command asks for a prefix argument, the value prefix-argument is
- supplied. If execute-extended-command is called interactively, the current raw
- prefix argument is used for prefix-argument, and thus passed on to whatever
- command is run.
-
- execute-extended-command is the normal definition of M-x, so it uses the string
- `M-x ' as a prompt. (It would be better to take the prompt from the characters
- used to invoke execute-extended-command, but that is painful to implement.) A
- description of the value of the prefix argument, if any, also becomes part of
- the prompt.
-
- (execute-extended-command 1)
- ---------- Buffer: Minibuffer ----------
- M-x forward-word RET
- ---------- Buffer: Minibuffer ----------
- => t
-
- -- Function: interactive-p
- This function returns t if the containing function (the one that called
- interactive-p) was called interactively, with call-interactively. (It makes no
- difference whether call-interactively was called from Lisp or directly from the
- editor command loop.) Note that if the containing function was called by Lisp
- evaluation (or with apply or funcall), then it was not called interactively.
-
- The usual application of interactive-p is for deciding whether to print an
- informative message. As a special exception, interactive-p returns nil
- whenever a keyboard macro is being run. This is to suppress the informative
- messages and speed execution of the macro.
-
- For example:
-
- (defun foo ()
- (interactive)
- (and (interactive-p)
- (message "foo")))
- => foo
-
- (defun bar ()
- (interactive)
- (setq foobar (list (foo) (interactive-p))))
- => bar
-
- ;; Type M-x foo.
- -| foo
-
- ;; Type M-x bar.
- ;; This does not print anything.
-
- foobar
- => (nil t)
-
-
- ΓòÉΓòÉΓòÉ 21.4. Information from the Command Loop ΓòÉΓòÉΓòÉ
-
- The editor command loop sets several Lisp variables to keep status records for
- itself and for commands that are run.
-
- -- Variable: last-command
- This variable records the name of the previous command executed by the command
- loop (the one before the current command). Normally the value is a symbol with
- a function definition, but this is not guaranteed.
-
- The value is set by copying the value of this-command when a command returns to
- the command loop, except when the command specifies a prefix argument for the
- following command.
-
- -- Variable: this-command
- This variable records the name of the command now being executed by editor
- command loop. Like last-command, it is normally a symbol with a function
- definition.
-
- This variable is set by the command loop just before the command is run, and
- its value is copied into last-command when the command finishes (unless the
- command specifies a prefix argument for the following command).
-
- Some commands change the value of this variable during their execution, simply
- as a flag for whatever command runs next. In particular, the functions that
- kill text set this-command to kill-region so that any kill commands immediately
- following will know to append the killed text to the previous kill.
-
- -- Function: this-command-keys
- This function returns a string containing the key sequence that invoked the
- present command, plus any previous commands that generated the prefix argument
- for this command.
-
- (this-command-keys) ;; Now type C-u C-x C-e.
- => "^U^X^E"
-
- -- Variable: last-command-char
- This variable is set to the last character that was typed on the terminal and
- was part of a command. The principal use of this variable is in
- self-insert-command, which uses it to decide which character to insert.
-
- last-command-char ;; Now type C-u C-x C-e.
- => 5
-
- The value is 5 because that is the ASCII code for C-e.
-
- -- Variable: echo-keystrokes
- This variable determines how much time should elapse before command characters
- are echoed. Its value must be an integer, which specifies the number of
- seconds to wait before echoing. If the user types a prefix key (say C-x) and
- then delays this many seconds before continuing, the key C-x is echoed in the
- echo area. Any subsequent characters in the same command will be echoed as
- well.
-
- If the value is zero, then command input is not echoed.
-
-
- ΓòÉΓòÉΓòÉ 21.5. Keyboard Input ΓòÉΓòÉΓòÉ
-
- The editor command loop reads keyboard input using read-key-sequence, which
- uses read-char. These and other functions for keyboard input are also
- available for use in Lisp programs. See also momentary-string-display in
- Temporary Displays, and sit-for in Waiting. See Terminal Input, for functions
- and variables for controlling terminal input modes and debugging terminal
- input.
-
- -- Function: read-char
- This function reads a character from the command input (either from direct
- keyboard input or from an executing keyboard macro), and returns it.
-
- No message is displayed to indicate that keyboard input is expected. If you
- want to display a message, call message first. If cursor-in-echo-area is
- non-nil, then the cursor moves to the echo area, to the end of any message
- displayed there. Otherwise the cursor does not move. See The Echo Area.
-
- In the first example, the user types 1 (which is ASCII code 49). The second
- example shows a keyboard macro definition that calls read-char from the
- minibuffer. read-char reads the keyboard macro's very next character, which is
- 1. The value of this function is displayed in the echo area by the command
- eval-expression.
-
- (read-char)
- => 49
-
- (symbol-function 'foo)
- => "^[^[(read-char)^M1"
- (execute-kbd-macro foo)
- -| 49
- => nil
-
- -- Function: read-quoted-char &optional prompt
- This function is like read-char, except that if the first character read is an
- octal digit (0-7), it reads up to two more octal digits (but stopping if a
- non-octal digit is found) and returns the character represented by those digits
- as an octal number.
-
- Quitting is suppressed when the first character is read, so that the user can
- enter a C-g. See Quitting.
-
- If prompt is supplied, it specifies a string for prompting the user. The
- prompt string is always printed in the echo area and followed by a single `-'.
-
- In the following example, the user types in the octal number 177 (which is 127
- in decimal).
-
- (read-quoted-char "What character")
-
- ---------- Echo Area ----------
- What character-177
- ---------- Echo Area ----------
-
- => 127
-
- -- Function: read-key-sequence prompt
- This function reads a key sequence and returns it as a string. It keeps
- reading characters until it has accumulated a full key sequence; that is,
- enough characters to specify a non-prefix command using the current local and
- global keymaps. read-key-sequence is used by the command loop to read command
- input.
-
- If an input character is an upper case letter and has no definition, but the
- lower case equivalent is defined, then the character is converted to lower
- case. Note that lookup-key does not perform case conversion in this way.
-
- Quitting is suppressed inside read-key-sequence. In other words, a C-g typed
- while reading with this function is treated like any other character, and
- quit-flag is not set. See Quitting.
-
- The argument prompt is either a string to be displayed in the echo area as a
- prompt, or nil, meaning that no prompt is displayed.
-
- In the example below, the prompt `?' is displayed in the echo area, and the
- user types C-x C-f.
-
- (read-key-sequence "?")
-
- ---------- Echo Area ----------
- ?C-x C-f
- ---------- Echo Area ----------
-
- => "^X^F"
-
- -- Variable: unread-command-char
- This variable holds a character waiting to be read as the next input from the
- command input stream, or to the integer -1 if no character is waiting. The
- variable is used because in some cases an input function reads a character and
- then decides not to use it. Storing the character in this variable causes it to
- be processed normally by the command loop or when read-char is next called.
-
- For example, the function that governs prefix arguments reads any number of
- digits. When it finds a non-digit character, it must unread the character so
- that it becomes input for the next command. Likewise, incremental search uses
- this feature to unread a control character used to terminate the search.
-
- -- Function: input-pending-p
- This function determines whether command input is currently available. It
- returns immediately, with value t if there is input, nil otherwise. On rare
- occasions it may return t when no input is available.
-
- -- Variable: last-input-char
- This variable records the last terminal input character read, whether as part
- of a command or explicitly by a Lisp program.
-
- In the example below, a character is read (the character 1, ASCII code 49).
- It becomes the value of last-input-char, while C-e (from the C-x C-e command
- used to evaluate this expression) remains the value of last-command-char.
-
- (progn (print (read-char))
- (print last-command-char)
- last-input-char)
- -| 49
- -| 5
- => 49
-
- -- Function: discard-input
- This function discards the contents of the terminal input buffer and cancels
- any keyboard macro that might be in the process of definition. It returns nil.
-
- In the following example, the user may type a number of characters right after
- starting the evaluation of the form. After the sleep-for finishes sleeping,
- any characters that have been typed are discarded.
-
- (progn (sleep-for 2)
- (discard-input))
- => nil
-
-
- ΓòÉΓòÉΓòÉ 21.6. Quitting ΓòÉΓòÉΓòÉ
-
- Typing C-g while the command loop has run a Lisp function causes Emacs to quit
- whatever it is doing. This means that control returns to the innermost active
- command loop.
-
- Typing C-g while the command loop is waiting for keyboard input does not cause
- a quit; it acts as an ordinary input character. In the simplest case, you
- cannot tell the difference, because C-g normally runs the command
- keyboard-quit, whose effect is to quit. However, when C-g follows a prefix key,
- the result is an undefined key. The effect is to cancel the prefix key as well
- as any prefix argument.
-
- In the minibuffer, C-g has a different definition: it aborts out of the
- minibuffer. This means, in effect, that it exits the minibuffer and then
- quits. (Simply quitting would return to the command loop within the
- minibuffer.) The reason why C-g does not quit directly when the command reader
- is reading input is so that its meaning can be redefined in the minibuffer in
- this way. C-g following a prefix key is not redefined in the minibuffer, and
- it has its normal effect of canceling the prefix key and prefix argument. This
- too would not be possible if C-g quit directly.
-
- C-g causes a quit by setting the variable quit-flag to a non-nil value. Emacs
- checks this variable at appropriate times and quits if it is not nil. Setting
- quit-flag non-nil in any way thus causes a quit.
-
- At the level of C code, quits cannot happen just anywhere; only at the special
- places which check quit-flag. The reason for this is that quitting at other
- places might leave an inconsistency in Emacs's internal state. Because
- quitting is delayed until a safe place, quitting cannot make Emacs crash.
-
- Certain functions such as read-key-sequence or read-quoted-char prevent
- quitting entirely even though they wait for input. Instead of quitting, C-g
- serves as the requested input. In the case of read-key-sequence, this serves
- to bring about the special behavior of C-g in the command loop. In the case of
- read-quoted-char, this is so that C-q can be used to quote a C-g.
-
- You can prevent quitting for a portion of a Lisp function by binding the
- variable inhibit-quit to a non-nil value. Then, although C-g still sets
- quit-flag to t as usual, the usual result of this---a quit---is prevented.
- Eventually, inhibit-quit will become nil again, such as when its binding is
- unwound at the end of a let form. At that time, if quit-flag is still non-nil,
- the requested quit happens immediately. This behavior is ideal for a
- ``critical section'', where you wish to make sure that quitting does not happen
- within that part of the program.
-
- In some functions (such as read-quoted-char), C-g is handled in a special way
- which does not involve quitting. This is done by reading the input with
- inhibit-quit bound to t and setting quit-flag to nil before inhibit-quit
- becomes nil again. This excerpt from the definition of read-quoted-char shows
- how this is done; it also shows that normal quitting is permitted after the
- first character of input.
-
- (defun read-quoted-char (&optional prompt)
- "...documentation..."
- (let ((count 0) (code 0) char)
- (while (< count 3)
- (let ((inhibit-quit (zerop count))
- (help-form nil))
- (and prompt (message "%s-" prompt))
- (setq char (read-char))
- (if inhibit-quit (setq quit-flag nil)))
- ...)
- (logand 255 code)))
-
- -- Variable: quit-flag
- If this variable is non-nil, then Emacs quits immediately, unless inhibit-quit
- is non-nil. Typing C-g sets quit-flag non-nil, regardless of inhibit-quit.
-
- -- Variable: inhibit-quit
- This variable determines whether Emacs should quit when quit-flag is set to a
- value other than nil. If inhibit-quit is non-nil, then quit-flag has no
- special effect.
-
- -- Command: keyboard-quit
- This function signals the quit condition with (signal 'quit nil). This is the
- same thing that quitting does. (See signal in Errors.)
-
- You can specify a character other than C-g to use for quitting. See the
- function set-input-mode in Terminal Input.
-
-
- ΓòÉΓòÉΓòÉ 21.7. Prefix Command Arguments ΓòÉΓòÉΓòÉ
-
- Most Emacs commands can use a prefix argument, a number specified before the
- command itself. (Don't confuse prefix arguments with prefix keys.) The prefix
- argument is represented by a value that is always available (though it may be
- nil, meaning there is no prefix argument). Each command may use the prefix
- argument or ignore it.
-
- There are two representations of the prefix argument: raw and numeric. The
- editor command loop uses the raw representation internally, and so do the Lisp
- variables that store the information, but commands can request either
- representation.
-
- Here are the possible values of a raw prefix argument:
-
- o nil, meaning there is no prefix argument. Its numeric value is 1, but
- numerous commands make a distinction between nil and the integer 1.
-
- o An integer, which stands for itself.
-
- o A list of one element, which is an integer. This form of prefix argument
- results from one or a succession of C-u's with no digits. The numeric value
- is the integer in the list, but some commands make a distinction between such
- a list and an integer alone.
-
- o The symbol -. This indicates that M-- or C-u - was typed, without following
- digits. The equivalent numeric value is -1, but some commands make a
- distinction between the integer -1 and the symbol -.
-
- The various possibilities may be illustrated by calling the following function
- with various prefixes:
-
- (defun print-prefix (arg)
- "Print the value of the raw prefix arg at point."
- (interactive "P")
- (message "%s" arg))
-
- Here are the results of calling print-prefix with various raw prefix arguments:
-
- M-x print-prefix -| nil
-
- C-u M-x print-prefix -| (4)
-
- C-u C-u M-x print-prefix -| (16)
-
- C-u 3 M-x print-prefix -| 3
-
- M-3 M-x print-prefix -| 3 ; (Same as C-u 3.)
-
- C-u - M-x print-prefix -| -
-
- M- - M-x print-prefix -| - ; (Same as C-u -.)
-
- C-u -7 M-x print-prefix -| -7
-
- M- -7 M-x print-prefix -| -7 ; (Same as C-u -7.)
-
- There are two variables used to store the prefix argument: prefix-arg and
- current-prefix-arg. Commands such as universal-argument that set up prefix
- arguments for other commands store them in prefix-arg. In contrast,
- current-prefix-arg conveys the prefix argument to the current command, so
- setting it has no effect on the prefix arguments for future commands.
-
- Normally, commands specify which representation to use for the prefix
- argument, either numeric or raw, in the interactive declaration. (See
- Interactive Call.) Alternatively, functions may look at the value of the
- prefix argument directly in the variable current-prefix-arg, but this is less
- clean.
-
- Don't call universal-argument, digit-argument, or negative-argument unless you
- intend to let the user enter the prefix argument for the next command.
-
- -- Command: universal-argument
- This command reads input and specifies a prefix argument for the following
- command. Don't call this command yourself unless you know what you are doing.
-
- -- Command: digit-argument arg
- This command adds to the prefix argument for the following command. The
- argument arg is the raw prefix argument as it was before this command; it is
- used to compute the updated prefix argument. Don't call this command yourself
- unless you know what you are doing.
-
- -- Command: negative-argument arg
- This command adds to the numeric argument for the next command. The argument
- arg is the raw prefix argument as it was before this command; its value is
- negated to form the new prefix argument. Don't call this command yourself
- unless you know what you are doing.
-
- -- Function: prefix-numeric-value arg
- This function returns the numeric meaning of a valid raw prefix argument value,
- arg. The argument may be a symbol, a number, or a list. If it is nil, the
- value 1 is returned; if it is any other symbol, the value -1 is returned. If
- it is a number, that number is returned; if it is a list, the car of that list
- (which should be a number) is returned.
-
- -- Variable: current-prefix-arg
- This variable is the value of the raw prefix argument for the current command.
- Commands may examine it directly, but the usual way to access it is with
- (interactive "P").
-
- -- Variable: prefix-arg
- The value of this variable is the raw prefix argument for the next editing
- command. Commands that specify prefix arguments for the following command work
- by setting this variable.
-
-
- ΓòÉΓòÉΓòÉ 21.8. Recursive Editing ΓòÉΓòÉΓòÉ
-
- The Emacs command loop is entered automatically when Emacs starts up. This
- top-level invocation of the command loop is never exited until the Emacs is
- killed. Lisp programs can also invoke the command loop. Since this makes more
- than one activation of the command loop, we call it recursive editing. A
- recursive editing level has the effect of suspending whatever command invoked
- it and permitting the user to do arbitrary editing before resuming that
- command.
-
- The commands available during recursive editing are the same ones available in
- the top-level editing loop and defined in the keymaps. Only a few special
- commands exit the recursive editing level; the others return to the recursive
- editing level when finished. (The special commands for exiting are always
- available, but do nothing when recursive editing is not in progress.)
-
- All command loops, including recursive ones, set up all-purpose error handlers
- so that an error in a command run from the command loop will not exit the loop.
-
- Minibuffer input is a special kind of recursive editing. It has a few special
- wrinkles, such as enabling display of the minibuffer and the minibuffer window,
- but fewer than you might suppose. Certain keys behave differently in the
- minibuffer, but that is only because of the minibuffer's local map; if you
- switch windows, you get the usual Emacs commands.
-
- To invoke a recursive editing level, call the function recursive-edit. This
- function contains the command loop; it also contains a call to catch with tag
- exit, which makes it possible to exit the recursive editing level by throwing
- to exit (see Catch and Throw). If you throw a value other than t, then
- recursive-edit returns normally to the function that called it. The command
- C-M-c (exit-recursive-edit) does this. Throwing a t value causes recursive-edit
- to quit, so that control returns to the command loop one level up. This is
- called aborting, and is done by C-] (abort-recursive-edit).
-
- Most applications should not use recursive editing, except as part of using
- the minibuffer. Usually it is more convenient for the user if you change the
- major mode of the current buffer temporarily to a special major mode, which has
- a command to go back to the previous mode. (This technique is used by the w
- command in Rmail.) Or, if you wish to give the user different text to edit
- ``recursively'', create and select a new buffer in a special mode. In this
- mode, define a command to complete the processing and go back to the previous
- buffer. (The m command in Rmail does this.)
-
- Recursive edits are useful in debugging. You can insert a call to debug into
- a function definition as a sort of breakpoint, so that you can look around when
- the function gets there. debug invokes a recursive edit but also provides the
- other features of the debugger.
-
- Recursive editing levels are also used when you type C-r in query-replace or
- use C-x q (kbd-macro-query).
-
- -- Function: recursive-edit
- This function invokes the editor command loop. It is called automatically by
- the initialization of Emacs, to let the user begin editing. When called from a
- Lisp program, it enters a recursive editing level.
-
- In the following example, the function simple-rec first advances point one
- word, then enters a recursive edit, printing out a message in the echo area.
- The user can then do any editing desired, and then type C-M-c to exit and
- continue executing simple-rec.
-
- (defun simple-rec ()
- (forward-word 1)
- (message "Recursive edit in progress.")
- (recursive-edit)
- (forward-word 1))
- => simple-rec
- (simple-rec)
- => nil
-
- -- Command: exit-recursive-edit
- This function exits from the innermost recursive edit (including minibuffer
- input). Its definition is effectively (throw 'exit nil).
-
- -- Command: abort-recursive-edit
- This function aborts the command that requested the innermost recursive edit
- (including minibuffer input), by signaling quit after exiting the recursive
- edit. Its definition is effectively (throw 'exit t). See Quitting.
-
- -- Command: top-level
- This function exits all recursive editing levels; it does not return a value,
- as it jumps completely out of any computation directly back to the main command
- loop.
-
- -- Function: recursion-depth
- This function returns the current depth of recursive edits. When no recursive
- edit is active, it returns 0.
-
-
- ΓòÉΓòÉΓòÉ 21.9. Disabling Commands ΓòÉΓòÉΓòÉ
-
- Disabling a command marks the command as requiring user confirmation before it
- can be executed. Disabling is used for commands which might be confusing to
- beginning users, to prevent them from using the commands by accident.
-
- The low-level mechanism for disabling a command is to put a non-nil disabled
- property on the Lisp symbol for the command. These properties are normally set
- up by the user's `.emacs' file with Lisp expressions such as this:
-
- (put 'upcase-region 'disabled t)
-
- For a few commands, these properties are present by default and may be removed
- by the `.emacs' file.
-
- If the value of the disabled property is a string, that string is included in
- the message printed when the command is used:
-
- (put 'delete-region 'disabled
- "Text deleted this way cannot be yanked back!\n")
-
- See Disabling, for the details on what happens when a disabled command is
- invoked interactively. Disabling a command has no effect on calling it as a
- function from Lisp programs.
-
- -- Command: enable-command command
- Allow command to be executed without special confirmation from now on. The
- user's `.emacs' file is optionally altered so that this will apply to future
- sessions.
-
- -- Command: disable-command command
- Require special confirmation to execute command from now on. The user's
- `.emacs' file is optionally altered so that this will apply to future sessions.
-
- -- Variable: disabled-command-hook
- The value of this variable is a function to be called instead of any command
- that is disabled (i.e., that has a non-nil disabled property). By default, the
- value of disabled-command-hook is a function defined to ask the user whether to
- proceed.
-
-
- ΓòÉΓòÉΓòÉ 21.10. Command History ΓòÉΓòÉΓòÉ
-
- The command loop keeps a history of the complex commands that have been
- executed, to make it convenient to repeat these commands. A complex command is
- one for which the interactive argument reading uses the minibuffer. This
- includes any M-x command, any M-ESC command, and any command whose interactive
- specification reads an argument from the minibuffer. Explicit use of the
- minibuffer during the execution of the command itself does not cause the
- command to be considered complex.
-
- -- Variable: command-history
- This variable's value is a list of recent complex commands, each represented as
- a form to evaluate. It continues to accumulate all complex commands for the
- duration of the editing session, but all but the first (most recent) thirty
- elements are deleted when a garbage collection takes place (see Garbage
- Collection).
-
- command-history
- => ((switch-to-buffer "chistory.texi")
- (describe-key "^X^[")
- (visit-tags-table "~/emacs/src/")
- (find-tag "repeat-complex-command"))
-
- There are a number of commands and even two entire modes devoted to
- facilitating the editing and recall of previous commands. The commands
- repeat-complex-command, and list-command-history are described in the user
- manual ( see Repetition).
-
- -- Variable: repeat-complex-command-map
- The value of this variable is a sparse keymap used by the minibuffer inside of
- read-complex-command.
-
-
- ΓòÉΓòÉΓòÉ 21.11. Keyboard Macros ΓòÉΓòÉΓòÉ
-
- A keyboard macro is a canned sequence of keystrokes that can be considered a
- command and made the definition of a key. Don't confuse keyboard macros with
- Lisp macros (see Macros).
-
- -- Function: execute-kbd-macro macro &optional count
- This function executes macro as a string of editor commands. If macro is a
- string, then the characters in that string are executed exactly as if they had
- been typed as command input.
-
- If macro is a symbol, then its function definition is used in place of macro.
- If that is another symbol, this process repeats. Eventually the result should
- be a string. If the result is neither a symbol nor a string, an error is
- signaled.
-
- The argument count is a repeat count; macro is executed that many times. If
- count is omitted or nil, macro is executed once. If it is 0, macro is executed
- over and over until it encounters an error or a failing search.
-
- -- Variable: last-kbd-macro
- This variable is the definition of the most recently defined keyboard macro.
- Its value is a string or nil.
-
- -- Variable: executing-macro
- This variable contains the string that defines the keyboard macro that is
- currently executing. It is nil if no macro is currently executing.
-
- -- Variable: defining-kbd-macro
- This variable indicates whether a keyboard macro is being defined. It is set
- to t by start-kbd-macro, and nil by end-kbd-macro. It is not hard to use this
- variable to make a command behave differently when run from a keyboard macro
- (perhaps indirectly by calling interactive-p). However, do not set this
- variable yourself.
-
- The user-level commands for defining, running and editing keyboard macros
- include call-last-kbd-macro, insert-kbd-macro, start-kbd-macro, end-kbd-macro,
- kbd-macro-query, and name-last-kbd-macro. They are described in the user's
- manual (see Keyboard Macros).
-
-
- ΓòÉΓòÉΓòÉ 22. Keymaps ΓòÉΓòÉΓòÉ
-
- The bindings between keyboard input and commands are recorded in data
- structures called keymaps. Each binding in a keymap associates (or binds) an
- individual character either with another keymap or with a command. When a
- character is bound to a keymap, that keymap is used to look up the next
- character typed; this continues until a command is found. This process is
- called key lookup.
-
-
- ΓòÉΓòÉΓòÉ 22.1. Keymaps: Terminology ΓòÉΓòÉΓòÉ
-
- A keymap is a table mapping characters to definitions (which can be any Lisp
- objects, though only certain types are meaningful for execution by the command
- loop). Given a character and a keymap, Emacs can get the character's
- definition.
-
- A sequence of keyboard input characters that form a unit is called a key
- sequence, or key for short. A sequence of one character is always a key
- sequence, and so are some multicharacter sequences.
-
- A keymap determines a binding or definition for any key sequence. If the key
- sequence is a single character, its binding is the definition of the character
- in the keymap. The binding of a multicharacter key sequence is found by an
- iterative process: the binding of the first character is found, and must be a
- keymap; then the second character's binding is found in that keymap, and so on
- until all the characters in the key sequence are used up.
-
- If the binding of a key sequence is a keymap, we call the key sequence a
- prefix key. Otherwise, we call it a complete key (because no more characters
- can be added to it). If the binding is nil, we call the key undefined.
- Examples of prefix keys are C-c, C-x, and C-x 4. Examples of defined complete
- keys are X, RET, and C-x 4 C-f. Examples of undefined complete keys are C-x
- C-g, and C-c 3. See Prefix Keys, for more details.
-
- The rule for finding the binding of a key sequence assumes that the
- intermediate bindings (found for the characters before the last) are all
- keymaps; if this is not so, the sequence of characters does not form a
- unit---it is not really a key sequence. In other words, removing one or more
- characters from the end of any key must always yield a prefix key. For example,
- C-f C-f is not a key; C-f is not a prefix key, so a longer sequence starting
- with C-f cannot be a key. Note that the set of possible multicharacter key
- sequences depends on the bindings for prefix keys; therefore, it can be
- different for different keymaps, and can change when bindings are changed.
- However, a one-character sequence is always a key sequence, because it does not
- depend on any prefix keys for its validity.
-
- At any time, two primary keymaps are in use for finding key bindings: the
- global map, which is shared by all buffers, and the local keymap, which is
- usually associated with a specific major mode. The local keymap bindings
- shadow (i.e., take precedence over) the corresponding global bindings. See
- Global and Local Keymaps, for details.
-
-
- ΓòÉΓòÉΓòÉ 22.2. Creating Keymaps ΓòÉΓòÉΓòÉ
-
- A keymap can be represented as one of two kinds of Lisp object: a vector or a
- list. A full keymap is a vector of length 128. The binding for a character in
- such a keymap is found by indexing into the vector with the character as the
- index.
-
- A sparse keymap is a list whose car is the symbol keymap, and whose remaining
- elements are cons cells of the form (char . binding). It is called a sparse
- keymap because it stores only the entries which are significant. Use a sparse
- keymap when you expect only a few entries. (define-key automatically creates
- sparse keymaps for intermediate keymaps.)
-
- Keymaps record directly only character codes less than 128; they are unable to
- handle directly the META characters, whose codes are from 128 to 255. Instead,
- META characters are regarded for purposes of key lookup as sequences of two
- characters, the first of which is ESC (the usual value of meta-prefix-char).
- Thus, the key M-a is really represented as ESC a, and its global binding is
- found at the slot for `a' in esc-map.
-
- Here as an example is the local keymap for Lisp mode, a sparse keymap. It
- defines C-c C-l as the run-lisp command, M-C-q as indent-sexp, and M-C-x as
- lisp-send-defun.
-
- lisp-mode-map
- =>
- (keymap
- (9 . lisp-indent-line) ; TAB
- (127 . backward-delete-char-untabify) ; DEL
- (3 keymap
- (12 . run-lisp)) ; C-c C-l
- (27 keymap
- (17 . indent-sexp) ; M-C-q, treated as ESC C-q
- (24 . lisp-send-defun))) ; M-C-x, treated as ESC C-x
-
- -- Function: keymapp object
- This function returns t if object is a keymap, nil otherwise. A keymap is
- either a vector of length 128, or a list with the form (keymap pairs...), where
- pairs stands for a series of associations, cons cells of the form (char .
- binding).
-
- (keymapp '(keymap))
- => t
- (keymapp (current-global-map))
- => t
-
- -- Function: make-keymap
- This function creates and returns a new full keymap (i.e., a vector of length
- 128). All entries in the keymap are nil, which means that no characters are
- defined.
-
- (make-keymap)
- => [nil nil nil ... nil nil]
-
- -- Function: make-sparse-keymap
- This function creates and returns a new sparse keymap with no entries. In this
- keymap, no characters are defined.
-
- (make-sparse-keymap)
- => (keymap)
-
- -- Function: copy-keymap keymap
- This function returns a copy of keymap. Any keymaps which appear directly as
- bindings in keymap are also copied recursively, and so on to any number of
- levels. However, recursive copying does not take place when the definition of
- a character is a symbol whose function definition is a keymap; the same symbol
- appears in the new copy.
-
- (setq map (copy-keymap (current-local-map)))
- => (keymap
- (27 keymap ; (This implements META characters.)
- (83 . center-paragraph)
- (115 . center-line))
- (9 . tab-to-tab-stop))
-
- (eq map (current-local-map))
- => nil
- (equal map (current-local-map))
- => t
-
-
- ΓòÉΓòÉΓòÉ 22.3. Key Lookup ΓòÉΓòÉΓòÉ
-
- Key lookup is the process of finding the binding of a key sequence from a
- given keymap. Actual execution of the definition is not part of key lookup.
-
- When the key sequence consists of multiple characters, the characters are
- handled sequentially: the binding of the first character is found, and must be
- a keymap; then the second character's binding is found in that keymap, and so
- on until all the characters in the key sequence are used up. (The binding thus
- found for the last character may or may not be a keymap.) Thus, the process of
- key lookup is defined in terms of a simpler process for looking up a single
- character in a keymap. How this is done depends on the type of object
- associated with the character in that keymap.
-
- The value directly associated with a character in a keymap is called a keymap
- entry. While any Lisp object may be stored in a keymap entry, only a few types
- of object make sense for key lookup. Here is a list of them, and what they
- mean:
-
- nil
- nil means that the characters used so far in the lookup form an
- undefined key. When a sparse keymap fails to mention a character,
- that is equivalent to an entry of nil.
-
- keymap
- The characters used so far in the lookup form a prefix key. The next
- character of the key sequence is looked up in keymap, which may be
- full or sparse.
-
- command
- The characters used so far in the lookup form a complete key, and
- command is its definition.
-
- string
- string represents a keyboard macro. The characters used so far in
- the lookup form a complete key, and string is its definition. (See
- Keyboard Macros, for more information.)
-
- list
- The meaning of a list depends on the types of the elements of the
- list.
-
- o If the car of list is the symbol keymap, then the list is a sparse keymap,
- and is treated as a keymap (see above).
-
- o If the car of list is lambda, then the list is a lambda expression. This
- is presumed to be a command, and is treated as such (see above).
-
- o If the car of list is a keymap and the cdr is a character, then this entry
- is an indirection to a slot in the other keymap. When an indirect entry
- is found in key lookup, it is immediately replaced by the entry in the
- specified keymap for the specified character. This permits you to define
- one key as an alias for another key. For example, an entry whose car is
- the keymap called esc-map and whose cdr is 32 (the code for space) means,
- ``Use the global definition of Meta-SPC, whatever that may be.''
-
- symbol
- The function definition of symbol is used in place of symbol. If
- that too is a symbol, then this process is repeated, any number of
- times. Ultimately this should lead to a definition which is a
- keymap, a command or a string. A list is allowed if it is a keymap
- or a command, but indirect entries are not understood when found via
- symbols.
-
- Note that keymaps and strings are not valid functions, so a symbol
- with a keymap or string as its function definition is likewise not
- valid as a function. It is, however, valid as a key binding. If the
- definition is a string, then the symbol is also valid as an argument
- to command-execute (see Interactive Call).
-
- The symbol undefined is worth special mention: it means to treat the
- key as undefined. Strictly speaking, the key is defined, and its
- definition is the symbol undefined, but that command does the same
- thing that is done automatically for an undefined key: it rings the
- bell (by calling ding) but does not signal an error.
-
- undefined is used in local keymaps to override a global key binding
- and make the key undefined locally. A local binding of nil would
- fail to do this because it would not override the global binding.
-
- anything else
- If any other type of object is found, the characters used so far in
- the lookup form a complete key, and the object is its definition.
-
- In short, a keymap entry may be a keymap, a command, a string, a symbol which
- leads to one of them, or an indirection or nil. Here is an example of a sparse
- keymap with two characters bound to commands and one bound to another keymap.
- This map is the normal value of emacs-lisp-mode-map. Note that 9 is the code
- for TAB, 127 for DEL, 27 for ESC, 17 for C-q and 24 for C-x.
-
- (keymap (9 . lisp-indent-line)
- (127 . backward-delete-char-untabify)
- (27 keymap (17 . indent-sexp) (24 . eval-defun)))
-
-
- ΓòÉΓòÉΓòÉ 22.4. Functions for Key Lookup ΓòÉΓòÉΓòÉ
-
- Here are the functions and variables pertaining to key lookup.
-
- -- Function: lookup-key keymap key
- This function returns the definition of key in keymap. If the string key is
- not a valid key sequence according to the prefix keys specified in keymap
- (which means it is ``too long'' and has extra characters at the end), then the
- value is a number, the number of characters at the front of key that compose a
- complete key.
-
- All the other functions described in this chapter that look up keys use
- lookup-key.
-
- (lookup-key (current-global-map) "\C-x\C-f")
- => find-file
- (lookup-key (current-global-map) "\C-x\C-f12345")
- => 2
-
- If key contains a meta-character, that character is implicitly replaced by a
- two-character sequence: the value of meta-prefix-char, followed by the
- corresponding non-meta character. Thus, the first example below is handled by
- conversion into the second example.
-
- (lookup-key (current-global-map) "\M-f")
- => forward-word
- (lookup-key (current-global-map) "\ef")
- => forward-word
-
- This function does not perform automatic downcasing like that of
- read-key-sequence (see Keyboard Input).
-
- -- Command: undefined
- Used in keymaps to undefine keys. It calls ding, but does not cause an error.
-
- -- Variable: meta-prefix-char
- This variable is the meta-prefix character code. It is used when translating
- a meta-character to a two-character sequence so it can be looked up in a
- keymap. For useful results, the value should be a prefix character (see Prefix
- Keys). The default value is 27, which is the ASCII code for ESC.
-
- As long as the value of meta-prefix-char remains 27, key lookup translates M-b
- into ESC b, which is normally defined as the backward-word command. However,
- if you set meta-prefix-char to 24, the code for C-x, then Emacs will translate
- M-b into C-x b, and call the switch-to-buffer command.
-
- meta-prefix-char ; The default value.
- => 27
- (key-binding "\M-b")
- => backward-word
- ?\C-x ; The print representation
- => 24 ; of a character.
- (setq meta-prefix-char 24)
- => 24
- (key-binding "\M-b")
- => switch-to-buffer ; Now, typing M-b is
- ; like typing C-x b.
-
- (setq meta-prefix-char 27) ; Avoid confusion!
- => 27 ; Restore the default value!
-
-
- ΓòÉΓòÉΓòÉ 22.5. Prefix Keys ΓòÉΓòÉΓòÉ
-
- A prefix key has an associated keymap which defines what to do with key
- sequences that start with the prefix key. For example, ctl-x-map is the keymap
- used for characters following the prefix key C-x. Here is a list of the
- standard prefix keys of Emacs and their keymaps:
-
- o ctl-x-map is the variable name for the map used for characters that follow
- C-x. This map is also the function definition of Control-X-prefix.
-
- o ctl-x-4-map used is for characters that follow C-x 4.
-
- o esc-map is used for characters that follow ESC. Thus, the global definitions
- of all Meta characters are actually found here. This map is also the
- function definition of ESC-prefix.
-
- o help-map is used for characters that follow C-h.
-
- o mode-specific-map is for characters that follow C-c. This map is not
- actually mode specific; its name was chosen to be informative for the user in
- C-h b (display-bindings), where it describes the main use of the C-c prefix
- key.
-
- The binding of a prefix key is the keymap to use for looking up the characters
- that follow the prefix key. (It may instead be a symbol whose function
- definition is a keymap. The effect is the same, but the symbol serves as a
- name for the prefix key.) Thus, the binding of C-x is the symbol
- Control-X-prefix, whose function definition is the keymap for C-x commands.
- This keymap is also the value of ctl-x-map.
-
- Prefix key definitions of this sort can appear in either the global map or a
- local map. The definitions of C-c, C-x, C-h and ESC as prefix keys appear in
- the global map, so these prefix keys are always available. Major modes can
- locally redefine a key as a prefix by putting a prefix key definition for it in
- the local map.
-
- If a key is defined as a prefix in both the local map and the global, the two
- definitions are effectively merged: the commands defined in the local map's
- prefix definition take priority; those not defined there are taken from the
- global map.
-
- In the following example, C-p is made a prefix key in the local keymap (so
- that C-p is identical to C-x). Then the binding for C-p C-f is the function
- find-file, just like C-x C-f. The key sequence C-p 6 is not found in either
- the local map or global map.
-
- (use-local-map (make-sparse-keymap))
- => nil
- (local-set-key "\C-p" ctl-x-map)
- => nil
- (key-binding "\C-p\C-f")
- => find-file
-
- (key-binding "\C-p6")
- => nil
-
- -- Function: define-prefix-command symbol
- This function defines symbol as a prefix command: it creates a full keymap and
- stores it as symbol's function definition. Storing the symbol as the binding of
- a key makes the key a prefix key which has a name. This function returns
- symbol.
-
- It is convenient to store the keymap as the value of a variable as well. In
- version 19, this function stores the keymap in both the function definition and
- value of symbol. However, in version 18, only the function definition of
- symbol is set, not the value.
-
-
- ΓòÉΓòÉΓòÉ 22.6. Global and Local Keymaps ΓòÉΓòÉΓòÉ
-
- The global keymap holds the bindings of keys that are defined regardless of
- the current buffer, such as C-f. The variable global-map holds this keymap.
-
- Each buffer may have another keymap, its local keymap, which may contain new
- or overriding definitions for keys. Each buffer records which local keymap is
- used with it.
-
- Both the global and local keymaps are used to determine what command to
- execute when a key is entered. The key lookup proceeds as described earlier
- (see Key Lookup), but Emacs first searches for the key in the local map; if
- Emacs does not find a local definition, Emacs then searches the global map.
-
- Since every buffer that uses the same major mode normally uses the very same
- local keymap, it may appear as if the keymap is local to the mode. A change to
- the local keymap of a buffer (using local-set-key, for example) will be seen
- also in the other buffers that share that keymap.
-
- The local keymaps that are used for Lisp mode, C mode, and several other major
- modes exist even if they have not yet been used. These local maps are the
- values of the variables lisp-mode-map, c-mode-map, and so on. For most other
- modes, which are less frequently used, the local keymap is constructed only
- when the mode is used for the first time in a session.
-
- The minibuffer has local keymaps, too; they contain various completion and
- exit commands. See Minibuffers.
-
- See Standard Keymaps, for a list of standard keymaps.
-
- -- Variable: global-map
- This variable contains the default global keymap that maps Emacs keyboard
- input to commands. Normally this keymap is the global keymap. The default
- global keymap is a full keymap that binds self-insert-command to all of the
- printing characters.
-
- -- Function: current-global-map
- This function returns the current global keymap. Normally, this is the same
- as the value of the global-map.
-
- (current-global-map)
- => [set-mark-command beginning-of-line ... delete-backward-char]
-
- -- Function: current-local-map
- This function returns the current buffer's local keymap, or nil if it has
- none. In the following example, the keymap for the `*scratch*' buffer (using
- Lisp Interaction mode) is a sparse keymap in which the entry for ESC, ASCII
- code 27, is another sparse keymap.
-
- (current-local-map)
- => (keymap
- (10 . eval-print-last-sexp)
- (9 . lisp-indent-line)
- (127 . backward-delete-char-untabify)
- (27 keymap
- (24 . eval-defun)
- (17 . indent-sexp)))
-
- -- Function: use-global-map keymap
- This function makes keymap the new current global keymap. The keymap map must
- be a full keymap (a vector of length 128). It returns nil.
-
- It is very unusual to change the global keymap.
-
- -- Function: use-local-map keymap
- This function makes keymap the new current local keymap of the current buffer.
- If keymap is nil, then there will be no local keymap. It returns nil. Most
- major modes use this function.
-
- -- Function: key-binding key
- This function returns the definition for key in the current keymaps trying the
- current buffer's local map and then the global map. The result is nil if key is
- undefined in the keymaps.
-
- An error is signaled if key is not a string.
-
- (key-binding "\C-x\C-f")
- => find-file
-
- -- Function: local-key-binding key
- This function returns the definition for key in the current local keymap, or
- nil if it is undefined there.
-
- -- Function: global-key-binding key
- This function returns the definition for command key in the current global
- keymap, or nil if it is undefined there.
-
-
- ΓòÉΓòÉΓòÉ 22.7. Changing Key Bindings ΓòÉΓòÉΓòÉ
-
- The way to rebind a key is to change its entry in a keymap. You can change
- the global keymap, so that the change is effective in all buffers (except those
- that override the global definition with a local one). Or you can change the
- current buffer's local map, which usually affects all buffers using the same
- major mode. The global-set-key and local-set-key functions are convenient
- interfaces for these operations. Or you can change bindings in any map by
- specifying it explicitly in define-key.
-
- People often use global-set-key in their `.emacs' file for simple
- customization. For example,
-
- (global-set-key "\C-x\C-\\" 'next-line)
-
- redefines C-x C-\ to move down a line.
-
- In writing the string for the key sequence to rebind, it is useful to use the
- special escape sequences for control and meta characters (see String Type). In
- a string, the syntax `\C-' means that the following character is a control
- character and `\M-' means that the following character is a META character.
- Thus, the string "\M-x" is read as containing a single M-x, "\C-f" is read as
- containing a single C-f, and "\M-\C-x" and "\C-\M-x" are both read as
- containing a single C-M-x.
-
- For the functions below, an error is signaled if keymap is not a keymap or if
- key is not a string representing a key sequence.
-
- -- Function: define-key keymap key definition
- This function sets the binding for key in keymap. (If key is more than one
- character long, the change is actually made in another keymap reached from
- keymap.) The argument definition can be any Lisp object, but only certain
- types are meaningful. (For a list of meaningful types, see Key Lookup.) The
- value returned by define-key is definition.
-
- Every prefix of key must be a prefix key (i.e., bound to a keymap) or
- undefined; otherwise an error is signaled (with data (error "Key sequence key
- uses invalid prefix characters")). If some prefix of key is undefined, then
- define-key defines it as a prefix key so that the rest of key may be defined as
- specified.
-
- In the following example, a sparse keymap is created and a number of bindings
- are added to it.
-
- (setq map (make-sparse-keymap))
- => (keymap)
- (define-key map "\C-f" 'forward-char)
- => forward-char
- map
- => (keymap (6 . forward-char))
-
- ;; Build sparse submap for C-x and bind f in that.
- (define-key map "\C-xf" 'forward-word)
- => forward-word
- map
- => (keymap
- (24 keymap ; C-x
- (102 . forward-word)) ; f
- (6 . forward-char)) ; C-f
-
- ;; Bind C-p to the ctl-x-map.
- (define-key map "\C-p" ctl-x-map)
- => [nil ... find-file ... backward-kill-sentence] ; ctl-x-map
-
- ;; Bind C-f to foo in the ctl-x-map.
- (define-key map "\C-p\C-f" 'foo)
- => 'foo
- map
- => (keymap ; Note foo in ctl-x-map.
- (16 . [nil ... foo ... backward-kill-sentence])
- (24 keymap
- (102 . forward-word))
- (6 . forward-char))
-
- Note that storing a new binding for C-p C-f actually works by changing an entry
- in ctl-x-map, and this has the effect of changing the bindings of both C-p C-f
- and C-x C-f in the default global map.
-
- -- Function: substitute-key-definition olddef newdef keymap
- This function replaces olddef with newdef for any keys in keymap that were
- bound to olddef. In other words, olddef is replaced with newdef wherever it
- appears. It returns nil.
-
- Prefix keymaps that appear within keymap are not checked recursively for keys
- bound to olddef; they are not changed at all. Perhaps it would be better to
- check nested keymaps recursively.
-
- (setq map '(keymap
- (?1 . olddef-1)
- (?2 . olddef-2)
- (?3 . olddef-1)))
- => (keymap (49 . olddef-1) (50 . olddef-2) (51 . olddef-1))
-
- (substitute-key-definition 'olddef-1 'newdef map)
- => nil
- map
- => (keymap (49 . newdef) (50 . olddef-2) (51 . newdef))
-
- ;; The following will redefine C-x C-f, if you do it in an
- ;; Emacs with standard bindings.
-
- (substitute-key-definition
- 'find-file 'find-file-read-only (current-global-map))
-
- -- Function: suppress-keymap keymap &optional nodigits
- This function changes the contents of the full keymap keymap by replacing the
- self-insertion commands for numbers with the digit-argument function, unless
- nodigits is non-nil, and by replacing the functions for the rest of the
- printing characters with undefined. This means that ordinary insertion of text
- is impossible in a buffer with a local keymap on which suppress-keymap has been
- called.
-
- suppress-keymap returns nil.
-
- The suppress-keymap function does not make it impossible to modify a buffer, as
- it does not suppress commands such as yank and quote-insert. To prevent any
- modification of a buffer, make it read-only (see Read Only Buffers).
-
- Since this function modifies keymap, you would normally use it on a newly
- created keymap. Operating on an existing keymap that is used for some other
- purpose is likely to cause trouble; for example, suppressing global-map would
- make it impossible to use most of Emacs.
-
- Most often, suppress-keymap is used for initializing local keymaps of modes
- such as Rmail and Dired where insertion of text is not desirable and the buffer
- is read-only. Here is an example taken from the file `emacs/lisp/dired.el',
- showing how the local keymap for Dired mode is set up:
-
- ...
- (setq dired-mode-map (make-keymap))
- (suppress-keymap dired-mode-map)
- (define-key dired-mode-map "r" 'dired-rename-file)
- (define-key dired-mode-map "\C-d" 'dired-flag-file-deleted)
- (define-key dired-mode-map "d" 'dired-flag-file-deleted)
- (define-key dired-mode-map "v" 'dired-view-file)
- (define-key dired-mode-map "e" 'dired-find-file)
- (define-key dired-mode-map "f" 'dired-find-file)
- ...
-
-
- ΓòÉΓòÉΓòÉ 22.8. Commands for Binding Keys ΓòÉΓòÉΓòÉ
-
- This section describes some convenient interactive interfaces for changing key
- bindings. They work by calling define-key.
-
- -- Command: global-set-key key definition
- This function sets the binding of key in the current global map to definition.
-
- (global-set-key key definition)
- ==
- (define-key (current-global-map) key definition)
-
- -- Command: global-unset-key key
- This function removes the binding of key from the current global map.
-
- One use of this function is in preparation for defining a longer key which uses
- it implicitly as a prefix---which would not be allowed otherwise. For example:
-
- (global-unset-key "\C-l")
- => nil
- (global-set-key "\C-l\C-l" 'redraw-display)
- => nil
-
- This function is implemented simply using define-key:
-
- (global-unset-key key)
- ==
- (define-key (current-global-map) key nil)
-
- -- Command: local-set-key key definition
- This function sets the binding of key in the current local keymap to
- definition.
-
- (local-set-key key definition)
- ==
- (define-key (current-local-map) key definition)
-
- -- Command: local-unset-key key
- This function removes the binding of key from the current local map.
-
- (local-unset-key key)
- ==
- (define-key (current-local-map) key nil)
-
-
- ΓòÉΓòÉΓòÉ 22.9. Scanning Keymaps ΓòÉΓòÉΓòÉ
-
- This section describes functions used to scan all the current keymaps for the
- sake of printing help information.
-
- -- Function: accessible-keymaps keymap
- This function returns a list of all the keymaps that can be accessed (via
- prefix keys) from keymap. The list returned is an association list with
- elements of the form (key . map), where key is a prefix whose definition in
- keymap is map.
-
- The elements of the alist are ordered so that the key increases in length.
- The first element is always ("" . keymap), because the specified keymap is
- accessible from itself with a prefix of no characters.
-
- In the example below, the returned alist indicates that the key ESC, which is
- displayed as "^[", is a prefix key whose definition is the sparse keymap
- (keymap (83 . center-paragraph) (115 . foo)).
-
- (accessible-keymaps (current-local-map))
- =>(("" keymap
- (27 keymap ; Note this keymap for ESC is repeated below.
- (83 . center-paragraph)
- (115 . center-line))
- (9 . tab-to-tab-stop))
-
- ("^[" keymap
- (83 . center-paragraph)
- (115 . foo)))
-
- In the following example, C-h is a prefix key that uses a sparse keymap
- starting (118 . describe-variable) .... Another prefix, C-x 4, uses the full
- keymap beginning [nil ...] (which happens to be ctl-x-4-map).
-
- (accessible-keymaps (current-global-map))
- => (("" . [set-mark-command beginning-of-line ...
- delete-backward-char])
- ("^C" keymap (13 . x-flush-mouse-queue))
- ("^H" keymap (118 . describe-variable) ... (8 . help-for-help))
- ("^X" . [x-flush-mouse-queue ... backward-kill-sentence])
- ("^[" . [mark-sexp backward-sexp ... backward-kill-word])
- ("^X4" . [nil ... find-file-other-window nil ... nil nil]))
-
- -- Function: where-is-internal command &optional keymap firstonly
- This function returns a list of key sequences (of any length) that are bound
- to command in keymap and the global keymap. The argument command can be any
- object; it is compared with all keymap entries using eq. If keymap is not
- supplied, then the global map alone is used.
-
- If firstonly is non-nil, then the value is a single string representing the
- first key sequence found, rather than a list of all possible key sequences.
-
- This function is used by where-is ( see Help).
-
- (where-is-internal 'describe-function)
- => ("\^hf" "\^hd")
-
- -- Command: describe-bindings
- This function creates a listing of all defined keys, and their definitions.
- The listing is put in a buffer named `*Help*', which is then displayed in a
- window.
-
- A meta character is shown as ESC followed by the corresponding non-meta
- character. Control characters are indicated with C-.
-
- When several consecutive characters have the same definition, they are shown
- together, as `firstchar..lastchar'. In this instance, you need to know the
- ASCII codes to understand which characters this means. For example, in the
- default global map, the characters `SPC .. ~' are described by a single line.
- SPC is ASCII 32, ~ is ASCII 126, and the characters between them include all
- the normal printing characters, (e.g., letters, digits, punctuation, etc.); all
- these characters are bound to self-insert-command.
-
-
- ΓòÉΓòÉΓòÉ 23. Major and Minor Modes ΓòÉΓòÉΓòÉ
-
- A mode is a set of definitions that customize Emacs and can be turned on and
- off while you edit. There are two varieties of modes: major modes, which are
- mutually exclusive and used for editing particular kinds of text, and minor
- modes, which provide features that may be enabled individually.
-
- This chapter covers both major and minor modes, the way they are indicated in
- the mode line, and how they run hooks supplied by the user. Related topics such
- as keymaps and syntax tables are covered in separate chapters. (See Keymaps,
- and Syntax Tables.)
-
-
- ΓòÉΓòÉΓòÉ 23.1. Major Modes ΓòÉΓòÉΓòÉ
-
- Major modes specialize Emacs for editing particular kinds of text. Each buffer
- has only one major mode at a time.
-
- The least specialized major mode is called Fundamental mode. This mode has no
- mode-specific definitions or variable settings, so each Emacs command behaves
- in its default manner, and each option is in its default state. All other
- major modes redefine various keys and options. For example, Lisp Interaction
- mode provides special key bindings for LFD (eval-print-last-sexp), TAB
- (lisp-indent-line), and other keys.
-
- When you need to write several editing commands to help you perform a
- specialized editing task, creating a new major mode is usually a good idea. In
- practice, writing a major mode is easy (in sharp contrast to writing a minor
- mode, which is often difficult).
-
- If the new mode is similar to an old one, it is often unwise to modify the old
- one to serve two purposes, since it may become harder to use and maintain.
- Instead, copy and rename an existing major mode definition and alter it for its
- new function. For example, Rmail Edit mode, which is in
- `emacs/lisp/rmailedit.el', is a major mode that is very similar to Text mode
- except that it provides three additional commands. Its definition is distinct
- from that of Text mode, but was derived from it.
-
- Rmail Edit mode is an example of a case where one piece of text is put
- temporarily into a different major mode so it can be edited in a different way
- (with ordinary Emacs commands rather than Rmail). In such cases, the temporary
- major mode usually has a command to switch back to the buffer's usual mode
- (Rmail mode, in this case). You might be tempted to present the temporary
- redefinitions inside a recursive edit and restore the usual ones when the user
- exits; but this is a bad idea because it constrains the user's options when it
- is done in more than one buffer: recursive edits must be exited
- most-recently-entered first. Using alternative major modes avoids this
- limitation. See Recursive Editing.
-
- The standard GNU Emacs Lisp library directory contains the code for several
- major modes, in files including `text-mode.el', `texinfo.el', `lisp-mode.el',
- `c-mode.el', and `rmail.el'. You can look at these libraries to see how modes
- are written. Text mode is perhaps the simplest major mode aside from
- Fundamental mode. Rmail mode is a rather complicated, full-featured mode.
-
-
- ΓòÉΓòÉΓòÉ 23.1.1. Major Mode Conventions ΓòÉΓòÉΓòÉ
-
- The code for existing major modes follows various coding conventions,
- including conventions for local keymap and syntax table initialization, global
- names, and hooks. Please keep these conventions in mind when you create a new
- major mode:
-
- o Define a command whose name ends in `-mode', with no arguments, that switches
- to the new mode in the current buffer. This command should set up the
- keymap, syntax table, and local variables in an existing buffer without
- changing the buffer's text.
-
- o Write a documentation string for this command which describes the special
- commands available in this mode. C-h m (describe-mode) will print this.
-
- The documentation string may include the special documentation substrings,
- `\[command]', `\{keymap}', and `\<keymap>', that enable the documentation to
- adapt automatically to the user's own key bindings. The describe-mode
- function replaces these special documentation substrings with their current
- meanings. See Accessing Documentation.
-
- o The major mode command should set the variable major-mode to the major mode
- command symbol. This is how describe-mode discovers which documentation to
- print.
-
- o The major mode command should set the variable mode-name to the ``pretty''
- name of the mode, as a string. This appears in the mode line.
-
- o Since all global names are in the same name space, all the global variables,
- constants, and functions that are part of the mode should have names that
- start with the major mode name (or with an abbreviation of it if the name is
- long).
-
- o The major mode should usually have its own keymap, which is used as the local
- keymap in all buffers in that mode. The major mode function should call
- use-local-map to install this local map. See Global and Local Keymaps, for
- more information.
-
- This keymap should be kept in a global variable named modename-mode-map.
- This variable is usually set up when the library that defines the mode is
- loaded. Use defvar to set the variable, so that it is not reinitialized if
- it already has a value. (Such reinitialization could discard customizations
- made by the user.)
-
- o The mode may have its own syntax table or may share one with other related
- modes. If it has its own syntax table, it should store this in a variable
- named modename-mode-syntax-table. The reasons for this are the same as for
- using a keymap variable. See Syntax Tables.
-
- o The mode may have its own abbrev table or may share one with other related
- modes. If it has its own abbrev table, it should store this in a variable
- named modename-mode-abbrev-table. See Abbrev Tables.
-
- o To give a variable a buffer-local binding, use make-local-variable in the
- major mode command, not make-variable-buffer-local. The latter function
- would make the variable local to every buffer in which it is subsequently
- set, which would affect buffers that do not use this mode. It is undesirable
- for a mode to have such global effects. See Buffer-Local Variables.
-
- o If hooks are appropriate for the mode, the major mode command should run the
- hooks after completing all other initialization so the user may further
- customize any of the settings. See Hooks.
-
- o If this mode is appropriate only for specially-prepared text, then the major
- mode command symbol should have a property named mode-class with value
- special, put on as follows:
-
- (put 'funny-mode 'mode-class 'special)
-
- This tells Emacs that new buffers created while the current buffer has Funny
- mode should not inherit Funny mode. Modes such as Dired, Rmail, and Buffer
- List use this feature.
-
- o If it is desirable that Emacs use the new mode by default after visiting
- files with certain recognizable names, add an element to auto-mode-alist to
- select the mode for those file names. If you define the mode command to
- autoload, you should add this element at the same time. Otherwise, it is
- sufficient to add the element in the file that contains the mode definition.
- See Auto Major Mode.
-
- o In the documentation, you should provide a sample autoload form and a sample
- auto-mode-alist addition that users can include in their `.emacs' files.
-
- o The top level forms in the file defining the mode should be written so that
- they may be evaluated more than once without adverse consequences. Even if
- you never load the file more than once, someone else will.
-
-
- ΓòÉΓòÉΓòÉ 23.1.2. Major Mode Examples ΓòÉΓòÉΓòÉ
-
- Text mode is perhaps the simplest mode besides Fundamental mode. Here are
- excerpts from `text-mode.el' that illustrate many of the conventions listed
- above:
-
- ;; Create mode-specific tables.
- (defvar text-mode-syntax-table nil
- "Syntax table used while in text mode.")
-
- (if text-mode-syntax-table
- () ; Do not change the table if it is already set up.
- (setq text-mode-syntax-table (make-syntax-table))
- (set-syntax-table text-mode-syntax-table)
- (modify-syntax-entry ?\" ". " text-mode-syntax-table)
- (modify-syntax-entry ?\\ ". " text-mode-syntax-table)
- (modify-syntax-entry ?' "w " text-mode-syntax-table))
-
- (defvar text-mode-abbrev-table nil
- "Abbrev table used while in text mode.")
- (define-abbrev-table 'text-mode-abbrev-table ())
-
- (defvar text-mode-map nil "") ; Create a mode-specific keymap.
-
- (if text-mode-map
- () ; Do not change the keymap if it is already set up.
- (setq text-mode-map (make-sparse-keymap))
- (define-key text-mode-map "\t" 'tab-to-tab-stop)
- (define-key text-mode-map "\es" 'center-line)
- (define-key text-mode-map "\eS" 'center-paragraph))
-
- Here is the complete major mode function definition for Text mode:
-
- (defun text-mode ()
- "Major mode for editing text intended for humans to read.
- Special commands: \\{text-mode-map}
- Turning on text-mode calls the value of the variable text-mode-hook,
- if that value is non-nil."
- (interactive)
- (kill-all-local-variables)
- (use-local-map text-mode-map) ; This provides the local keymap.
- (setq mode-name "Text") ; This name goes into the mode line.
- (setq major-mode 'text-mode) ; This is how describe-mode
- ; finds the doc string to print.
- (setq local-abbrev-table text-mode-abbrev-table)
- (set-syntax-table text-mode-syntax-table)
- (run-hooks 'text-mode-hook)) ; Finally, this permits the user to
- ; customize the mode with a hook.
-
- The three Lisp modes (Lisp mode, Emacs Lisp mode, and Lisp Interaction mode)
- have more features than Text mode and the code is correspondingly more
- complicated. Here are excerpts from `lisp-mode.el' that illustrate how these
- modes are written.
-
- ;; Create mode-specific table variables.
- (defvar lisp-mode-syntax-table nil "")
- (defvar emacs-lisp-mode-syntax-table nil "")
- (defvar lisp-mode-abbrev-table nil "")
-
- (if (not emacs-lisp-mode-syntax-table) ; Do not change the table
- ; if it is already set.
- (let ((i 0))
- (setq emacs-lisp-mode-syntax-table (make-syntax-table))
-
- ;; Set syntax of chars up to 0 to class of chars that are
- ;; part of symbol names but not words.
- ;; (The number 0 is 48 in the ascii character set.)
- (while (< i ?0)
- (modify-syntax-entry i "_ " emacs-lisp-mode-syntax-table)
- (setq i (1+ i)))
- ...
- ;; Set the syntax for other characters.
- (modify-syntax-entry ? " " emacs-lisp-mode-syntax-table)
- (modify-syntax-entry ?\t " " emacs-lisp-mode-syntax-table)
- ...
- (modify-syntax-entry ?\( "() " emacs-lisp-mode-syntax-table)
- (modify-syntax-entry ?\) ")( " emacs-lisp-mode-syntax-table)
- ...))
- ;; Create an abbrev table for lisp-mode.
- (define-abbrev-table 'lisp-mode-abbrev-table ())
-
- Much code is shared among the three Lisp modes; the code is all in one
- library. The following function sets various variables; it is called by each
- of the major Lisp mode functions:
-
- (defun lisp-mode-variables (lisp-syntax)
- ;; The lisp-syntax argument is nil in Emacs Lisp mode,
- ;; and t in the other two Lisp modes.
- (cond (lisp-syntax
- (if (not lisp-mode-syntax-table)
- ;; The Emacs Lisp mode syntax table always exists, but
- ;; the Lisp Mode syntax table is created the first time a
- ;; mode that needs it is called. This is to save space.
- (progn (setq lisp-mode-syntax-table
- (copy-syntax-table emacs-lisp-mode-syntax-table))
- ;; Change some entries for Lisp mode.
- (modify-syntax-entry ?\| "\" "
- lisp-mode-syntax-table)
- (modify-syntax-entry ?\[ "_ "
- lisp-mode-syntax-table)
- (modify-syntax-entry ?\] "_ "
- lisp-mode-syntax-table)))
- (set-syntax-table lisp-mode-syntax-table)))
- (setq local-abbrev-table lisp-mode-abbrev-table)
- ...)
-
- Functions such as forward-word use the value of the paragraph-start variable.
- Since Lisp code is different from ordinary text, the paragraph-start variable
- needs to be set specially to handle Lisp. Also, comments are indented in a
- special fashion in Lisp and the Lisp modes need their own mode-specific
- comment-indent-hook. The code to set these variables is the rest of
- lisp-mode-variables.
-
- (make-local-variable 'paragraph-start)
- (setq paragraph-start (concat "^$\\|" page-delimiter))
- ...
- (make-local-variable 'comment-indent-hook)
- (setq comment-indent-hook 'lisp-comment-indent))
-
- Each of the different Lisp modes has a slightly different keymap. For
- example, Lisp mode binds C-c C-l to run-lisp, but the other Lisp modes do not.
- However, all Lisp modes have some commands in common. The following function
- adds these common commands to a given keymap.
-
- (defun lisp-mode-commands (map)
- (define-key map "\e\C-q" 'indent-sexp)
- (define-key map "\177" 'backward-delete-char-untabify)
- (define-key map "\t" 'lisp-indent-line))
-
- Here is an example of using lisp-mode-commands to initialize a keymap, as part
- of the code for Emacs Lisp mode. First defvar is used to declare a
- mode-specific keymap variable. Then boundp tests whether the
- emacs-lisp-mode-map variable has a value (is not void). If the variable does
- have a value, we do not change it. This lets the user customize the keymap if
- he or she so wishes. Otherwise, we initialize it to a new sparse keymap and
- install the default key bindings.
-
- (defvar emacs-lisp-mode-map () "")
-
- (if emacs-lisp-mode-map
- ()
- (setq emacs-lisp-mode-map (make-sparse-keymap))
- (define-key emacs-lisp-mode-map "\e\C-x" 'eval-defun)
- (lisp-mode-commands emacs-lisp-mode-map))
-
- Finally, here is the complete major mode function definition for Emacs Lisp
- mode.
-
- (defun emacs-lisp-mode ()
- "Major mode for editing Lisp code to run in Emacs.
- Commands:
- Delete converts tabs to spaces as it moves back.
- Blank lines separate paragraphs. Semicolons start comments.
- \\{emacs-lisp-mode-map}
- Entry to this mode calls the value of emacs-lisp-mode-hook
- if that value is non-nil."
- (interactive)
- (kill-all-local-variables)
- (use-local-map emacs-lisp-mode-map) ; This provides the local keymap.
- (set-syntax-table emacs-lisp-mode-syntax-table)
- (setq major-mode 'emacs-lisp-mode) ; This is how describe-mode
- ; finds out what to describe.
- (setq mode-name "Emacs-Lisp") ; This goes into the mode line.
- (lisp-mode-variables nil) ; This define various variables.
- (run-hooks 'emacs-lisp-mode-hook)) ; This permits the user to use a
- ; hook to customize the mode.
-
-
- ΓòÉΓòÉΓòÉ 23.1.3. How Emacs Chooses a Major Mode Automatically ΓòÉΓòÉΓòÉ
-
- Based on information in the file name or in the file itself, Emacs
- automatically selects a major mode for the new buffer when a file is visited.
-
- -- Command: fundamental-mode
- Fundamental mode is a major mode that is not specialized for anything in
- particular. Other major modes are defined in effect by comparison with this
- one---their definitions say what to change, starting from Fundamental mode.
- The fundamental-mode function does not run any hooks, so it is not readily
- customizable.
-
- -- Command: normal-mode &optional find-file
- This function establishes the proper major mode and local variable bindings
- for the current buffer. First it calls set-auto-mode, then it runs
- hack-local-variables to parse, and bind or evaluate as appropriate, any local
- variables.
-
- If the find-file argument to normal-mode is non-nil, normal-mode assumes that
- the find-file function is calling it. In this case, if inhibit-local-variables
- is non-nil, it asks for confirmation before processing a local variables list.
- If you run normal-mode yourself, the argument find-file is normally nil, so
- confirmation is not requested.
-
- normal-mode uses condition-case around the call to the major mode function, so
- errors are caught and reported as a `File mode specification error', followed
- by the original error message.
-
- -- Function: set-auto-mode
- This function selects the major mode that is appropriate for the current
- buffer. It may base its decision on the value of the `-*-' line, on the
- visited file name (using auto-mode-alist), or on the value of a local
- variable). However, this function does not look for the `mode:' local variable
- near the end of a file; the hack-local-variables function does that. See How
- Major Modes are Chosen.
-
- -- User Option: default-major-mode
- This variable holds the default major mode for new buffers. The standard
- value is fundamental-mode.
-
- If the value of default-major-mode is nil, Emacs uses the (previously) current
- buffer's major mode for major mode of a new buffer. However, if the major mode
- symbol has a mode-class property with value special, then it is not used for
- new buffers; Fundamental mode is used instead. The modes that have this
- property are those such as Dired and Rmail that are useful only with text that
- has been specially prepared.
-
- -- Variable: initial-major-mode
- The value of this variable determines the major mode of the initial
- `*scratch*' buffer. The value should be a symbol that is a major mode command
- name. The default value is lisp-interaction-mode.
-
- -- Variable: auto-mode-alist
- This variable contains an association list of file name patterns (regular
- expressions; see Regular Expressions) and corresponding major mode functions.
- Usually, the file name patterns test for suffixes, such as `.el' and `.c', but
- this need not be the case. Each element of the alist looks like (regexp .
- mode-function).
-
- For example,
-
- (("^/tmp/fol/" . text-mode)
- ("\\.texinfo$" . texinfo-mode)
- ("\\.texi$" . texinfo-mode)
- ("\\.el$" . emacs-lisp-mode)
- ("\\.c$" . c-mode)
- ("\\.h$" . c-mode)
- ...)
-
- When you visit a file whose full path name matches a regexp, set-auto-mode
- calls the corresponding mode-function. This feature enables Emacs to select
- the proper major mode for most files.
-
- Here is an example of how to prepend several pattern pairs to an existing
- auto-mode-alist. (You might use this sort of expression in your `.emacs'
- file.)
-
- (setq auto-mode-alist
- (append
- '(("/\\.[^/]*$" . fundamental-mode) ; Filename starts with a dot.
- ("[^\\./]*$" . fundamental-mode) ; Filename has no dot.
- ("\\.C$" . c++-mode))
- auto-mode-alist))
-
- -- Function: hack-local-variables &optional force
- This function parses, and binds or evaluates as appropriate, any local
- variables for the current buffer.
-
- If the variable inhibit-local-variables is non-nil, and force is nil, then the
- user is asked for confirmation if the buffer does contain local variable
- specifications. A non-nil value of force is passed by normal-mode when it is
- called explicitly by the user.
-
- See Local Variables in Files, for the syntax of the local variables section of
- a file.
-
- -- User Option: inhibit-local-variables
- When this variable is non-nil, hack-local-variables asks the user for
- confirmation before obeying a file's local-variables list.
-
-
- ΓòÉΓòÉΓòÉ 23.1.4. Getting Help about a Major Mode ΓòÉΓòÉΓòÉ
-
- The describe-mode function is used to provide information about major modes.
- It is normally called with C-h m. The describe-mode function uses the value of
- major-mode, which is why every major mode function needs to set the major-mode
- variable.
-
- -- Command: describe-mode
- This function displays the documentation of the current major mode.
-
- The describe-mode function calls the documentation function using the value of
- major-mode as an argument. Thus, it displays the documentation string of the
- major mode function. (See Accessing Documentation.)
-
- -- Variable: major-mode
- This variable holds the symbol for the current buffer's major mode. This
- symbol should be the name of the function that is called to initialize the
- mode. The describe-mode function uses the documentation string of this symbol
- as the documentation of the major mode.
-
-
- ΓòÉΓòÉΓòÉ 23.2. Minor Modes ΓòÉΓòÉΓòÉ
-
- A minor mode provides features that users may enable or disable independently
- of the choice of major mode. Minor modes can be enabled individually or in
- combination. Minor modes would be better named ``Generally available, optional
- feature modes'' except that such a name is unwieldy.
-
- A minor mode is not usually a modification of single major mode. For example,
- auto-fill-mode and auto-justify-mode may be used in any major mode that permits
- text insertion. To be general, a minor mode must be effectively independent of
- the things major modes do.
-
- A minor mode is often much more difficult to implement than a major mode. One
- reason is that you should be able to deactivate a minor mode and restore the
- environment of the major mode to the state it was in before the minor mode was
- activated.
-
- Often the biggest problem in implementing a minor mode is finding a way to
- insert the necessary hook into the rest of Emacs. For example, some minor
- modes, such as Auto Fill mode, change how text is inserted into a buffer.
- Without auto-fill-hook, Auto Fill mode would be implementable only at great
- pain and great cost in editing efficiency.
-
-
- ΓòÉΓòÉΓòÉ 23.2.1. Conventions for Writing Minor Modes ΓòÉΓòÉΓòÉ
-
- There are conventions for writing minor modes just as there are for major
- modes. Several of the major mode conventions apply to minor modes as well:
- those regarding the name of the mode initialization function, the names of
- global symbols, and the use of keymaps and other tables.
-
- In addition, there are several conventions that are specific to minor modes.
-
- o The minor mode should be represented by a symbol whose name ends in `-mode'.
- This symbol should be both a command to turn the mode on or off and a
- variable which records whether the mode is on.
-
- This variable is used in conjunction with the minor-mode-alist to display the
- minor mode name in the mode line. It may also be directly responsible for
- controlling the features of the minor mode.
-
- If you want the minor mode to be enabled separately in each buffer, make the
- variable buffer-local.
-
- o A minor mode command should accept one optional argument. If the argument is
- nil, the function should toggle the mode (turn it on if it is off, and off if
- it is on). Otherwise, the function should turn the mode on if the argument
- is a positive integer, a symbol, or a list whose car is a positive integer;
- it should turn the mode off otherwise. (This convention has not been
- implemented with full consistency in Emacs version 18.)
-
- Here is an example taken from the definition of overwrite-mode:
-
- (setq overwrite-mode
- (if (null arg) (not overwrite-mode)
- (> (prefix-numeric-value arg) 0)))
-
- o Add an element to minor-mode-alist for each minor mode (see Mode Line
- Variables). This element should be a list of the following form:
-
- (mode-variable string)
-
- Here mode-variable is the variable that indicates the enablement of the minor
- mode, and string is a short string, starting with a space, to represent the
- mode in the mode line. These strings must be short so that there is room for
- several of them at once.
-
- When you add an element to minor-mode-alist, use assq to check for an
- existing element, to avoid duplication. For example:
-
- (or (assq 'leif-mode minor-mode-alist)
- (setq minor-mode-alist
- (cons '(leif-mode " Leif") minor-mode-alist)))
-
- o If the minor mode adds new key bindings to the local keymap, you should be
- able to restore the keymap to its original value when you deactivate the
- minor mode.
-
-
- ΓòÉΓòÉΓòÉ 23.2.2. Limitations of Minor Modes ΓòÉΓòÉΓòÉ
-
- It is very difficult to write a minor mode that responds to arbitrary
- self-inserting characters. The principal problem is that self-insert-command,
- the command to insert the last key typed, is a primitive function written in C.
- It does not call any hooks, except in special cases.
-
- Unfortunately, you cannot simply substitute your own definition of
- self-insert-command for the existing one, as you can with most functions. This
- is a consequence of the way the editor command loop works: it checks whether a
- key is bound to self-insert-command and, if so, it calls the primitive
- self-insert-command function directly. It does not check to see whether you
- have written another version of the function to substitute for it. This is
- done for speed. (In general, if you substitute a Lisp function for a primitive,
- the C code within Emacs will continue to call the original primitive, but Lisp
- code will call your substitute Lisp function.)
-
- Instead of attempting to replace the function definition for
- self-insert-command, you could rebind certain keys that call
- self-insert-command. This can be made to work as long as no two minor modes
- try to rebind the same key. In a minor mode that is global (affects all
- buffers), do the rebinding in the global map. In a minor mode that is local to
- individual buffers, you will need to copy the local keymap (since it is usually
- shared with all the other buffers in the same major mode) and then make the
- change.
-
-
- ΓòÉΓòÉΓòÉ 23.3. Mode Line Format ΓòÉΓòÉΓòÉ
-
- Each Emacs window includes a mode line which displays status information about
- the buffer displayed in the window. The mode line contains information about
- the buffer such as its name, associated file, depth of recursive editing, and
- the major and minor modes of the buffer. This section describes how the
- contents of the mode line are controlled. It is in the chapter on modes because
- much of the information displayed in the mode line relates to the enabled major
- and minor modes.
-
- mode-line-format is a buffer-local variable that holds a template used to
- display the mode line of the current buffer. All windows for the same buffer
- use the same mode-line-format and the mode lines will appear the same (except
- perhaps for the percentage of the file scrolled off the top).
-
- The mode line of a window is normally updated whenever a different buffer is
- shown in the window, or when the buffer's modified-status changes from nil to t
- or vice-versa. If you modify any of the variables referenced by
- mode-line-format, you may want to force an update of the mode line so as to
- display the new information. You can do this with the following expression:
-
- (set-buffer-modified-p (buffer-modified-p))
-
- The mode line is usually displayed in inverse video; see
- mode-line-inverse-video in Screen Attributes.
-
-
- ΓòÉΓòÉΓòÉ 23.3.1. The Data Structure of the Mode Line ΓòÉΓòÉΓòÉ
-
- The mode line contents are controlled by a data structure of lists, strings,
- symbols and numbers kept in the buffer-local variable mode-line-format. The
- data structure is called a mode line construct, and it is built in recursive
- fashion out of simpler mode line constructs.
-
- -- Variable: mode-line-format
- The value of this variable is a mode line construct with overall responsibility
- for the mode line format. The value of this variable controls which other
- variables are used to form the mode line text, and where they appear.
-
- A mode line construct may be as simple as a fixed string of text, but it
- usually specifies how to use other variables to construct the text. Many of
- these variables are themselves defined to have mode line constructs as their
- values.
-
- The default value of mode-line-format incorporates the values of variables
- such as mode-name and minor-mode-alist. Because of this, very few modes need to
- alter mode-line-format. For most purposes, it is sufficient to alter the
- variables referenced by mode-line-format.
-
- A mode line construct may be a list, cons cell, symbol, or string. If the
- value is a list, each element may be a list, a cons cell, a symbol, or a
- string.
-
- string
- A string as a mode line construct is displayed verbatim in the mode
- line except for %-constructs. Decimal digits after the % specify the
- field width for space filling on the right (i.e., the data is left
- justified). See %-Constructs.
-
- symbol
- A symbol as a mode line construct stands for its value. The value of
- symbol is used in place of symbol unless symbol is t or nil, or is
- void, in which case symbol is ignored.
-
- There is one exception: if the value of symbol is a string, it is
- processed verbatim in that the %-constructs are not recognized.
-
- (string rest...) or (list rest...)
- A list whose first element is a string or list, means to concatenate
- all the elements. This is the most common form of mode line
- construct.
-
- (symbol then else)
- A list whose first element is a symbol is a conditional. Its meaning
- depends on the value of symbol. If the value is non-nil, the second
- element of the list (then) is processed recursively as a mode line
- element. But if the value of symbol is nil, the third element of the
- list (if there is one) is processed recursively.
-
- (width rest...)
- A list whose first element is an integer specifies truncation or
- padding of the results of rest. The remaining elements rest are
- processed recursively as mode line constructs and concatenated
- together. Then the result is space filled (if width is positive) or
- truncated (to -width columns, if width is negative) on the right.
-
- For example, the usual way to show what percentage of a buffer is
- above the top of the window is to use a list like this: (-3 . "%p").
-
- If you do alter mode-line-format itself, the new value should use all the same
- variables that are used by the default value, rather than duplicating their
- contents or displaying the information in another fashion. This permits
- customizations made by the user, by libraries (such as display-time) or by
- major modes via changes to those variables remain effective.
-
- Here is an example of a mode-line-format that might be useful for shell-mode
- since it contains the hostname and default directory.
-
- (setq mode-line-format
- (list ""
- 'mode-line-modified
- "%b--"
- (getenv "HOST") ; One element is not constant.
- ":"
- 'default-directory
- " "
- 'global-mode-string
- " %[(" 'mode-name
- 'minor-mode-alist
- "%n"
- 'mode-line-process
- ")%]----"
- '(-3 . "%p")
- "-%-"))
-
-
- ΓòÉΓòÉΓòÉ 23.3.2. Variables Used in the Mode Line ΓòÉΓòÉΓòÉ
-
- This section describes variables incorporated by the standard value of
- mode-line-format into the text of the mode line. There is nothing inherently
- special about these variables; any other variables could have the same effects
- on the mode line if mode-line-format were changed to use them.
-
- -- Variable: mode-line-modified
- This variable holds the mode-line construct for displaying whether the current
- buffer is modified.
-
- The default value mode-line-modified is ("--%1*%1*-"). This means that the
- mode line displays `--**-' if the buffer is modified, `-----' if the buffer is
- not modified, and `--%%-' if the buffer is read only.
-
- Changing this variable does not force an update of the mode line.
-
- -- Variable: mode-line-buffer-identification
- This variable identifies the buffer being displayed in the window. Its default
- value is `Emacs: %17b', which means that it displays `Emacs:' followed by the
- buffer name. You may want to change this in modes such as Rmail that do not
- behave like a ``normal'' Emacs.
-
- -- Variable: global-mode-string
- This variable holds a string that is displayed in the mode line for the use of
- display-time. The `%M' construct substitutes the value of global-mode-string,
- but this is obsolete, since the variable is included directly in the mode line.
-
- -- Variable: mode-name
- This buffer-local variable holds the ``pretty'' name of the current buffer's
- major mode. Each major mode should set this variable so that the mode name
- will appear in the mode line.
-
- -- Variable: minor-mode-alist
- This variable holds an association list whose elements specify how the mode
- line should indicate that a minor mode is active. Each element of the
- minor-mode-alist should be a two-element list:
-
- (minor-mode-variable mode-line-string)
-
- The string mode-line-string is included in the mode line when the value of
- minor-mode-variable is non-nil and not otherwise. These strings should begin
- with spaces so that they don't run together. Conventionally, the
- minor-mode-variable for a specific mode is set to a non-nil value when that
- minor mode is activated.
-
- The default value of minor-mode-alist is:
-
- minor-mode-alist
- => ((abbrev-mode " Abbrev")
- (overwrite-mode " Ovwrt")
- (auto-fill-hook " Fill")
- (defining-kbd-macro " Def"))
-
- (Note that in version 19, auto-fill-hook will be renamed to
- auto-fill-function.)
-
- minor-mode-alist is not buffer-local. The variables mentioned in the alist
- should be buffer-local if the minor mode can be enabled separately in each
- buffer.
-
- -- Variable: mode-line-process
- This buffer-local variable contains the mode line information on process status
- in modes used for communicating with subprocesses. It is displayed immediately
- following the major mode name, with no intervening space. For example, its
- value in the `*shell*' buffer is (": %s"), which allows the shell to display
- its status along with the major mode as: `(Shell: run)'. Normally this
- variable is nil.
-
- -- Variable: default-mode-line-format
- This variable holds the default mode-line-format for buffers that do not
- override it. This is the same as (default-value 'mode-line-format).
-
- The default value of default-mode-line-format is:
-
- (""
- mode-line-modified
- mode-line-buffer-identification
- " "
- global-mode-string
- " %[("
- mode-name
- minor-mode-alist
- "%n"
- mode-line-process
- ")%]----"
- (-3 . "%p")
- "-%-")
-
-
- ΓòÉΓòÉΓòÉ 23.3.3. %-Constructs in the Mode Line ΓòÉΓòÉΓòÉ
-
- The following table lists the recognized %-constructs and what they mean.
-
- %b
- the current buffer name, using the buffer-name function.
-
- %f
- the visited file name, using the buffer-file-name function.
-
- %*
- `%' if the buffer is read only (see buffer-read-only);
- `*' if the buffer is modified (see buffer-modified-p);
- `-' otherwise.
-
- %s
- the status of the subprocess belonging to the current buffer, using
- process-status.
-
- %p
- the percent of the buffer above the top of window, or `Top', `Bottom'
- or `All'.
-
- %n
- `Narrow' when narrowing is in effect; nothing otherwise (see
- narrow-to-region in Narrowing).
-
- %[
- an indication of the depth of recursive editing levels (not counting
- minibuffer levels): one `[' for each editing level.
-
- %]
- one `]' for each recursive editing level (not counting minibuffer
- levels).
-
- %%
- the character `%'---this is how to include a literal `%' in a string
- in which %-constructs are allowed.
-
- %-
- dashes sufficient to fill the remainder of the mode line.
-
- The following two %-constructs are still supported but are obsolete since use
- of the mode-name and global-mode-string variables will produce the same
- results.
-
- %m
- the value of mode-name.
-
- %M
- the value of global-mode-string. Currently, only display-time
- modifies global-mode-string.
-
-
- ΓòÉΓòÉΓòÉ 23.4. Hooks ΓòÉΓòÉΓòÉ
-
- A hook is a variable whose value is a hook function (or a list of hook
- functions) to be called by parts of Emacs on certain defined occasions. The
- purpose of hooks is to facilitate customization, and the value of a hook is
- most often set up in the `.emacs' file, but it may be changed by programs. The
- function or functions used in a hook may be any of the valid kinds of functions
- that funcall accepts (see What Is a Function).
-
- Most modes run hooks as the last step of initialization. This makes it easy
- for a user to customize the behavior of the mode, by overriding the local
- variable assignments already made by the mode. But hooks may also be used in
- other contexts. For example, the functions named by find-file-not-found-hooks
- are called whenever a file is not found by find-file.
-
- For example, you can put the following expression in your `.emacs' file if you
- want to turn on Auto Fill mode when in Lisp Interaction mode:
-
- (setq lisp-interaction-mode-hook 'turn-on-auto-fill)
-
- The next example shows how to use a hook to customize the way Emacs formats C
- code. (People often have strong personal preferences for one format compared
- to another.) Here the hook function is an anonymous lambda expression.
-
- (setq c-mode-hook
- (function (lambda ()
- (setq c-indent-level 4
- c-argdecl-indent 0
- c-label-offset -4
- c-continued-statement-indent 0
- c-brace-offset 0
- comment-column 40))))
-
- (setq c++-mode-hook c-mode-hook)
-
- Finally, here is an example of how to use the Text mode hook to provide a
- customized mode line for buffers in Text mode, displaying the default directory
- in addition to the standard components of the mode line. (This may cause the
- mode line to run out of space if you have very long path names or display the
- time and load.)
-
- (setq text-mode-hook
- (function (lambda ()
- (setq mode-line-format
- '(mode-line-modified
- "Emacs: %14b"
- " "
- default-directory
- " "
- global-mode-string
- "%[("
- mode-name
- minor-mode-alist
- "%n"
- mode-line-process
- ") %]---"
- (-3 . "%p")
- "-%-")))))
-
- See Standard Hooks, for a list of standard hook variables.
-
- Most hook variables are initially void. This has no effect on examples such
- as the previous ones, where the hook variable is set without reference to any
- previous value. However, if you want to add an element to a hook variable
- which you use as a list of functions, you need to make sure the variable is not
- void. Here is how to do it using defvar:
-
- (defvar foo-hook nil)
- (or (memq 'my-hook foo-hook)
- (setq foo-hook (cons 'my-hook foo-hook)))
-
- At the appropriate time, Emacs uses the run-hooks function to run the hooks
- you have specified.
-
- -- Function: run-hooks &rest hookvar
- This function takes one or more hook names as arguments and runs each one in
- turn. Each hookvar argument should be a symbol that is a hook variable. These
- arguments are processed in the order specified.
-
- If a hook variable has a non-nil value, that value may be a function or a list
- of functions. If the value is a function (either a lambda expression or a
- symbol with a function definition), it is called. If it is a list, the
- elements are called, in order. The hook functions are called with no arguments.
-
- For example:
-
- (run-hooks 'emacs-lisp-mode-hook)
-
- Major mode functions use this function to call any hooks defined by the user.
-
-
- ΓòÉΓòÉΓòÉ 24. Documentation ΓòÉΓòÉΓòÉ
-
- GNU Emacs Lisp has convenient on-line help facilities, most of which derive
- their information from the documentation strings associated with functions and
- variables. This chapter describes how to write good documentation strings for
- your Lisp programs, as well as how to write programs to access documentation.
-
- Note that the documentation strings for Emacs are not the same thing as the
- Emacs manual. Manuals have their own source files, written in the Texinfo
- language; documentation strings are specified in the definitions of the
- functions and variables they apply to. A collection of documentation strings
- is not sufficient as a manual because a good manual is not organized in that
- fashion; it is organized in terms of topics of discussion.
-
-
- ΓòÉΓòÉΓòÉ 24.1. Documentation Basics ΓòÉΓòÉΓòÉ
-
- A documentation string is written using the Lisp syntax for strings, with
- double-quote characters surrounding the text of the string. This is because it
- really is a Lisp string object. The string serves as documentation when it is
- written in the proper place in the definition of a function or variable. In a
- function definition, the documentation string follows the argument list. In a
- variable definition, the documentation string follows the initial value of the
- variable.
-
- When you write a documentation string, make the first line a complete sentence
- (or two complete sentences) since some commands, such as apropos, print only
- the first line of a multi-line documentation string. Also, you should not
- indent the second line of a documentation string, if you have one, because that
- looks odd when you use C-h f (describe-function) or C-h v (describe-variable).
-
- Documentation strings may contain several special substrings, which stand for
- key bindings to be looked up in the current keymaps when the documentation is
- displayed. This allows documentation strings to refer to the keys for related
- commands and be accurate even when a user rearranges the key bindings. (See
- Accessing Documentation.)
-
- Within the Lisp world, a documentation string is kept with the function or
- variable that it describes:
-
- o The documentation for a function is stored in the function definition itself
- (see Lambda Expressions). The function documentation knows how to extract
- it.
-
- o The documentation for a variable is stored on the variable's property list
- under the property name variable-documentation. The function
- documentation-property knows how to extract it.
-
- However, to save space, the documentation for preloaded functions and
- variables (including primitive functions and autoloaded functions) are stored
- in the `emacs/etc/DOC-version' file. Both the documentation and the
- documentation-property functions know how to access `emacs/etc/DOC-version',
- and the process is transparent to the user. In this case, the documentation
- string is replaced with an integer offset into the `emacs/etc/DOC-version'
- file. Keeping the documentation strings out of the Emacs core image saves a
- significant amount of space. See Building Emacs.
-
- For information on the uses of documentation strings, see where-is-internal
- and describe-bindings in Global and Local Keymaps. Also, see Help.
-
- The `emacs/etc' directory contains two utilities for printing the
- `emacs/etc/DOC-version' file in hardcopy. These are `sorted-doc.c' and
- `digest-doc.c'.
-
-
- ΓòÉΓòÉΓòÉ 24.2. Access to Documentation Strings ΓòÉΓòÉΓòÉ
-
- -- Function: documentation-property symbol property
- This function returns the documentation string that is recorded symbol's
- property list under property property. This uses the function get, but does
- more than that: it also retrieves the string from the file
- `emacs/etc/DOC-version' if necessary, and runs substitute-command-keys to
- substitute the actual (current) key bindings.
-
- (documentation-property 'command-line-processed
- 'variable-documentation)
- => "t once command line has been processed"
- (symbol-plist 'command-line-processed)
- => (variable-documentation 188902)
-
- -- Function: documentation function
- This function returns the documentation string of function. If the
- documentation string is stored in the `emacs/etc/DOC-version' file, this
- function will access it there.
-
- In addition, documentation runs substitute-command-keys on the resulting
- string, so the value contains the actual (current) key bindings.
-
- The function documentation signals a void-function error unless function has a
- function definition. However, function does not need to have a documentation
- string. If there is no documentation string, documentation returns nil.
-
- Here is an example of using documentation and documentation-property to
- display the documentation strings for several symbols in a `*Help*' buffer.
-
- (defun describe-symbols (pattern)
- "Describe the Emacs Lisp symbols matching PATTERN.
- All symbols that have PATTERN in their name are described
- in the *Help* buffer."
- (interactive "sDescribe symbols matching: ")
- (let ((describe-func
- (function
- (lambda (s)
- ;; Print description of symbol.
- (if (fboundp s) ; It is a function.
- (princ
- (format "%s\t%s\n%s\n\n" s
- (if (commandp s)
- (concat "Command: "
- (or (mapconcat
- 'key-description
- (where-is-internal s)
- " ")))
- "Function")
- (or (documentation s)
- "not documented"))))
-
- (if (boundp s) ; It is a variable.
- (princ
- (format "%s\t%s\n%s\n\n" s
- (if (user-variable-p s)
- "Option " "Variable")
- (or (documentation-property
- s 'variable-documentation)
- "not documented")))))))
- sym-list)
-
- ;; Build a list of symbols that match pattern.
- (mapatoms (function
- (lambda (sym)
- (if (string-match pattern (symbol-name sym))
- (setq sym-list (cons sym sym-list))))))
-
- ;; Display the data.
- (with-output-to-temp-buffer "*Help*"
- (mapcar describe-func (sort sym-list 'string<))
- (print-help-return-message))))
-
- The describe-symbols function works like apropos, but provides more
- information.
-
- (describe-symbols "goal")
-
- ---------- Buffer: *Help* ----------
- goal-column Option
- *Semipermanent goal column for vertical motion,
- as set by C-x C-n, or nil.
-
- set-goal-column Command: C-x C-n
- Set the current horizontal position as a goal for C-n and C-p.
- Those commands will move to this position in the line moved to
- rather than trying to keep the same horizontal position.
- With a non-nil argument, clears out the goal column
- so that C-n and C-p resume vertical motion.
-
- temporary-goal-column Variable
- Current goal column for vertical motion.
- It is the column where point was at the start of current run
- of vertical motion commands.
- ---------- Buffer: *Help* ----------
-
- -- Function: Snarf-documentation filename
- This function is used only during Emacs initialization, just before the
- runnable Emacs is dumped. It finds the file offsets of the documentation
- strings stored in the file filename, and records them in the in-core function
- definitions and variable property lists in place of the actual strings. See
- Building Emacs.
-
- The file filename is found in the `emacs/etc' directory (usually filename is
- "DOC-version"). When the dumped Emacs is later executed, the same file is
- found in the exec-directory (see Subprocess Creation).
-
-
- ΓòÉΓòÉΓòÉ 24.3. Substituting Key Bindings in Documentation ΓòÉΓòÉΓòÉ
-
- -- Function: substitute-command-keys string
- This function returns string with certain special substrings replaced by the
- actual (current) key bindings are listed. This permits the documentation to be
- displayed with accurate information about key bindings. (The key bindings may
- be changed by the user between the time Emacs is built and the time that the
- documentation is asked for.)
-
- This table lists the forms of the special substrings and what they are
- replaced with:
-
- \[command]
- is replaced either by a keystroke sequence that will invoke command,
- or by `M-x command' if command is not bound to any key sequence.
-
- \{mapvar}
- is replaced by a summary (made by describe-bindings) of the value of
- mapvar, taken as a keymap.
-
- \<mapvar>
- makes this call to substitute-command-keys use the value of mapvar as
- the keymap for future `\[command]' substrings. This special string
- does not produce any replacement text itself; it only affects the
- replacements done later.
-
- *Note:* each `\' must be doubled when written in a string in Emacs Lisp.
-
- Here are examples of the special substrings:
-
- (substitute-command-keys
- "To abort recursive edit, type: \\[abort-recursive-edit]")
-
- => "To abort recursive edit, type: C-]"
-
- (substitute-command-keys
- "The keys that are defined for the minibuffer here are:
- \\{minibuffer-local-must-match-map}")
-
- => "The keys that are defined for the minibuffer here are:
-
- ? minibuffer-completion-help
- SPC minibuffer-complete-word
- TAB minibuffer-complete
- LFD minibuffer-complete-and-exit
- RET minibuffer-complete-and-exit
- C-g abort-recursive-edit
- "
-
- (substitute-command-keys
- "To abort a recursive edit from the minibuffer, type\
- \\<minibuffer-local-must-match-map>\\[abort-recursive-edit].")
- => "To abort a recursive edit from the minibuffer, type C-g."
-
-
- ΓòÉΓòÉΓòÉ 24.4. Describing Characters for Help Messages ΓòÉΓòÉΓòÉ
-
- These functions convert characters or strings to textual descriptions. These
- descriptions are useful for including arbitrary text characters or key
- sequences in messages, because they convert non-printing characters to
- sequences of printing characters. The description of a printing character is
- the character itself.
-
- -- Function: key-description string
- This function returns a string containing the Emacs standard notation for the
- keyboard characters in string. See the examples for single-key-description.
-
- -- Function: single-key-description character
- This function returns a string describing character in the standard Emacs
- notation for keyboard input. A normal printing character is represented by
- itself, but a control character turns into a string starting with `C-', a meta
- character turns into a string starting with `M-', and space, linefeed, etc. are
- transformed to `SPC', `LFD', etc.
-
- (single-key-description ?\C-x)
- => "C-x"
- (key-description "\C-x \M-y \n \t \r \f123")
- => "C-x SPC M-y SPC LFD SPC TAB SPC RET SPC C-l 1 2 3"
-
- -- Function: text-char-description character
- This function returns a string describing character in the standard Emacs
- notation for characters that appear in text---like single-key-description,
- except that that control characters are represented with a leading caret (which
- is how control characters in Emacs buffers are usually displayed).
-
- (text-char-description ?\C-c)
- => "^C"
- (text-char-description ?\M-m)
- => "M-m"
- (text-char-description ?\C-\M-m)
- => "M-^M"
-
-
- ΓòÉΓòÉΓòÉ 24.5. Help Functions ΓòÉΓòÉΓòÉ
-
- Emacs provides a variety of on-line help functions, all accessible to the user
- as subcommands of the prefix C-h. For more information about them, see Help.
- Here we describe some program-level interfaces to the same information.
-
- -- Command: apropos regexp &optional predicate noprint
- This function finds all symbols whose names contain a match for the regular
- expression regexp, and returns a list of them. Normally it displays the
- symbols in a buffer named `*Help*', each with a one-line description. If
- noprint is non-nil, it does not display them, but just returns the list.
-
- If predicate is non-nil, it should be a function to be called on each symbol
- that has matched regexp. Only symbols for which predicate returns a non-nil
- value are listed or displayed.
-
- When you call apropos interactively, it prompts for regexp in the minibuffer.
-
- In the first of the following examples, apropos finds all the symbols with
- names containing `exec'. They are returned but not displayed. In the second
- example, it finds and returns only those symbols that are also commands; in
- addition, they are then displayed in the `*Help*' buffer.
-
- (apropos "exec" nil t)
- => (Buffer-menu-execute command-execute exec-directory
- exec-path execute-extended-command execute-kbd-macro
- executing-kbd-macro executing-macro)
-
- (apropos "exec" 'commandp)
- => (Buffer-menu-execute execute-extended-command)
-
- ---------- Buffer: *Help* ----------
- Buffer-menu-execute
- Function: Save and/or delete buffers marked with
- M-x Buffer-menu-save or M-x Buffer-menu-delete commands.
- execute-extended-command ESC x
- Function: Read function name, then read its arguments and call it.
- ---------- Buffer: *Help* ----------
-
- The command C-h a (command-apropos) calls apropos, but specifies a predicate
- to restrict the output to symbols that are commands. The call to apropos looks
- like this:
-
- (apropos string 'commandp)
-
- -- Command: help-command
- This command is not a function, but rather a symbol which is equivalent to the
- keymap called help-map. It is defined in `help.el' as follows:
-
- (define-key global-map "\C-h" 'help-command)
- (fset 'help-command help-map)
-
- -- Variable: help-map
- The value of this variable is a local keymap for characters following the Help
- key, C-h.
-
- -- Function: print-help-return-message &optional function
- This function builds a string which is a message explaining how to restore the
- previous state of the windows after a help command. After building the
- message, it applies function to it if function is non-nil. Otherwise it calls
- message to display it in the echo area.
-
- This function expects to be called inside a with-output-to-temp-buffer special
- form, and expects standard-output to have the value bound by that special form.
- For an example of its use, see the example in the section describing the
- documentation function (see Accessing Documentation).
-
- The constructed message will have one of the forms shown below.
-
- ---------- Echo Area ----------
- Type C-x 1 to remove help window.
- ---------- Echo Area ----------
-
- ---------- Echo Area ----------
- Type C-x 4 b RET to restore old contents of help window.
- ---------- Echo Area ----------
-
- -- Variable: help-char
- The value of this variable is the character that Emacs recognizes as meaning
- Help. When Emacs reads this character (which is usually 8, the value of C-h),
- Emacs evaluates (eval help-form), and displays the result if it is a string.
- If help-form's value is nil, this character is read normally.
-
- -- Variable: help-form
- The value of this variable is a form to execute when the character help-char
- is read. If the form returns a string, that string is displayed. If help-form
- is nil, then the help character is not recognized.
-
- Entry to the minibuffer binds this variable to the value of
- minibuffer-help-form.
-
- The following two functions are found in the library `helper'. They are for
- modes that want to provide help without relinquishing control, such as the
- ``electric'' modes. You must load that library with (require 'helper) in order
- to use them. Their names begin with `Helper' to distinguish them from the
- ordinary help functions.
-
- -- Command: Helper-describe-bindings
- This command pops up a window displaying a help buffer containing a listing of
- all of the key bindings from both the local and global keymaps. It works by
- calling describe-bindings.
-
- -- Command: Helper-help
- This command provides help for the current mode. It prompts the user in the
- minibuffer with the message `Help (Type ? for further options)', and then
- provides assistance in finding out what the key bindings are, and what the mode
- is intended for. It returns nil.
-
- This can be customized by changing the map Helper-help-map.
-
-
- ΓòÉΓòÉΓòÉ 25. Files ΓòÉΓòÉΓòÉ
-
- In Emacs, you can find, create, view, save, and otherwise work with files and
- file directories. This chapter describes most of the file-related functions of
- Emacs Lisp, but a few others are described in Buffers, and those related to
- backups and auto-saving are described in Backups and Auto-Saving.
-
-
- ΓòÉΓòÉΓòÉ 25.1. Visiting Files ΓòÉΓòÉΓòÉ
-
- Visiting a file means reading a file into a buffer. Once this is done, we say
- that the buffer is visiting that file, and call the file ``the visited file''
- of the buffer.
-
- A file and a buffer are two different things. A file is information recorded
- permanently in the computer (unless you delete it). A buffer, on the other
- hand, is information inside of Emacs that will vanish at the end of the editing
- session (or when you kill the buffer). Usually, a buffer contains information
- that you have copied from a file; then we say the buffer is visiting that file.
- The copy in the buffer is what you modify with editing commands. Such changes
- to the buffer do not change the file; therefore, to make the changes permanent,
- you must save the buffer, which means copying the altered buffer contents back
- into the file.
-
- In spite of the distinction between files and buffers, people often refer to a
- file when they mean a buffer and vice-versa. Indeed, we say, ``I am editing a
- file,'' rather than, ``I am editing a buffer which I will soon save as a file
- of the same name.'' Humans do not usually need to make the distinction
- explicit. When dealing with a computer program, however, it is good to keep
- the distinction in mind.
-
-
- ΓòÉΓòÉΓòÉ 25.1.1. Functions for Visiting Files ΓòÉΓòÉΓòÉ
-
- This section describes the functions normally used to visit files. For
- historical reasons, these functions have names starting with `find-' rather
- than `visit-'. See Buffer File Name, for functions and variables that access
- the visited file name of a buffer or that find an existing buffer by its
- visited file name.
-
- -- Command: find-file filename
- This function reads the file filename into a buffer and displays that buffer
- in the selected window so that the user can edit it.
-
- The body of the find-file function is very simple and looks like this:
-
- (switch-to-buffer (find-file-noselect filename))
-
- (See switch-to-buffer in Displaying Buffers.)
-
- When find-file is called interactively, it prompts for filename in the
- minibuffer.
-
- -- Function: find-file-noselect filename
- This function is the guts of all the file-visiting functions. It reads a file
- into a buffer and returns the buffer. You may then make the buffer current or
- display it in a window if you wish, but this function does not do so.
-
- If no buffer is currently visiting filename, then one is created and the file
- is visited. If filename does not exist, the buffer is left empty, and
- find-file-noselect displays the message `New file' in the echo area.
-
- If a buffer is already visiting filename, then find-file-noselect uses that
- buffer rather than creating a new one. However, it does verify that the file
- has not changed since it was last visited or saved in that buffer. If the file
- has changed, then this function asks the user whether to reread the changed
- file. If the user says `yes', any changes previously made in the buffer will
- be lost.
-
- The find-file-noselect function calls after-find-file after the file is read
- in (see Subroutines of Visiting). The after-find-file function sets the buffer
- major mode, parses local variables, warns the user if there exists an auto-save
- file more recent than the file just visited, and finishes by running the
- functions in find-file-hooks.
-
- The find-file-noselect function returns the buffer that is visiting the file
- filename.
-
- (find-file-noselect "/etc/fstab")
- => #<buffer fstab>
-
- -- Command: find-alternate-file filename
- This function reads the file filename into a buffer and selects it, killing
- the buffer current at the time the command is run. It is useful if you have
- visited the wrong file by mistake, so that you can get rid of the buffer that
- you did not want to create, at the same time as you visit the file you
- intended.
-
- When this function is called interactively, it prompts for filename.
-
- -- Command: find-file-other-window filename
- This function visits the file filename and displays its buffer in a window
- other than the selected window. If there are two or more windows on the
- screen, then the window that is not selected is used. If there is only one
- window, it is split. The function returns nil.
-
- When this function is called interactively, it prompts for filename.
-
- -- Command: find-file-read-only filename
- This function visits the file named filename and selects its buffer, just like
- find-file, but it marks the buffer as read-only. See Read Only Buffers, for
- related functions and variables.
-
- When this function is called interactively, it prompts for filename.
-
- -- Command: view-file filename
- This function views filename in View mode, returning to the previous buffer
- when done. View mode is a mode that allows you to skim rapidly through the
- file but does not let you modify it.
-
- After loading the file, view-file calls the value of view-hook if that is
- non-nil.
-
- When this function is called interactively, it prompts for filename.
-
- -- Variable: find-file-hooks
- The value of this variable is a list of functions to be called after a file is
- visited. The file's local-variables specification (if any) will have been
- processed before the hooks are run. The buffer visiting the file is current
- when the hook functions are run.
-
- -- Variable: find-file-not-found-hooks
- The value of this variable is a list of functions to be called when find-file
- or find-file-noselect is passed a nonexistent filename. These functions are
- called as soon as the error is detected. buffer-file-name is already set up.
- The functions are called in the order given, until one of them returns non-nil.
-
-
- ΓòÉΓòÉΓòÉ 25.1.2. Subroutines of Visiting ΓòÉΓòÉΓòÉ
-
- The find-file-noselect function uses the create-file-buffer and
- after-find-file functions as subroutines. Sometimes it is useful to call them
- directly.
-
- -- Function: create-file-buffer filename
- This function creates a suitably named buffer for visiting filename, and
- returns it. The string filename (sans directory) is used unchanged if that
- name is free; otherwise, a string such as `<2>' is appended to get an unused
- name. See also Creating Buffers.
-
- *Note:* create-file-buffer does not associate the new buffer with a file and
- does not make it the current buffer.
-
- (create-file-buffer "foo")
- => #<buffer foo>
- (create-file-buffer "foo")
- => #<buffer foo<2>>
- (create-file-buffer "foo")
- => #<buffer foo<3>>
-
- This function is used by find-file-noselect.
-
- -- Function: after-find-file &optional error warn
- This function is called by find-file-noselect and by the default revert
- function (see Reverting). It sets the buffer major mode, and parses local
- variables (see Auto Major Mode).
-
- If there was an error in opening the file, the calling function should pass
- error a non-nil value. In that case, after-find-file issues a warning: `(New
- File)'. Note that, for serious errors, you would not even call
- after-find-file. Only ``file not found'' errors get here with a non-nil error.
-
- If warn is non-nil, then this function issues a warning if an auto-save file
- exists and is more recent than the visited file.
-
- The last thing after-find-file does is call all the functions in
- find-file-hooks.
-
-
- ΓòÉΓòÉΓòÉ 25.2. Saving Buffers ΓòÉΓòÉΓòÉ
-
- When you edit a file in Emacs, you are actually working on a buffer that is
- visiting that file---that is, the contents of the file are copied into the
- buffer and the copy is what you edit. Changes to the buffer do not change the
- file until you save the buffer, which means copying the contents of the buffer
- into the file.
-
- -- Command: save-buffer &optional backup-option
- This function saves the contents of the current buffer in its visited file if
- the buffer has been modified since it was last visited or saved. Otherwise it
- does nothing.
-
- save-buffer is responsible for making backup files. Normally, backup-option
- is nil, and save-buffer makes a backup file only if this is the first save or
- if the buffer was previously modified. Other values for backup-option request
- the making of backup files in other circumstances:
-
- o With an argument of 4 or 64, reflecting 1 or 3 C-u's, the save-buffer
- function marks this version of the file to be backed up when the buffer is
- next saved.
-
- o With an argument of 16 or 64, reflecting 2 or 3 C-u's, the save-buffer
- function unconditionally backs up the previous version of the file before
- saving it.
-
- -- Command: save-buffers-kill-emacs &optional kill-silently-p
- This function offers to save each buffer that needs to be saved, and then
- kills the Emacs job. With a non-nil value of the optional kill-silently-p
- argument, it unconditionally and silently saves all the file-visiting buffers,
- and then kills the job.
-
- The save-buffers-kill-emacs function is defined as follows:
-
- (defun save-buffers-kill-emacs (&optional arg)
- "Offer to save each buffer, then kill this Emacs fork..."
- (interactive "P")
- (save-some-buffers arg t)
- (kill-emacs))
-
- -- Command: save-some-buffers &optional save-silently-p exiting
- This command saves some modified file-visiting buffers. Normally it asks the
- user about each buffer. If the function is called with a non-nil value of the
- optional save-silently-p argument, this function saves all the file-visiting
- buffers without querying the user.
-
- The optional exiting argument, if non-nil, requests this function to offer
- also to save certain other buffers that are not visiting files. These are
- buffers that have a non-nil local value of buffer-offer-save. (A user who says
- yes to saving one of these will be asked to specify a file name to use.) The
- save-buffers-kill-emacs function passes a non-nil value for this argument.
-
- -- Variable: buffer-offer-save
- When this variable is non-nil in a buffer, Emacs offers to save the buffer on
- exit even if the buffer is not visiting a file. The variable is automatically
- local in all buffers. Normally, Mail mode (used for editing outgoing mail)
- sets this to t.
-
- -- Command: write-file filename
- This function writes the current buffer into file filename, makes the buffer
- visit that file, and marks it not modified. The buffer is renamed to
- correspond to filename unless that name is already in use.
-
- -- Variable: write-file-hooks
- The value of this variable is a list of functions to be called before writing
- out a buffer to its visited file. If one of them returns non-nil, the file is
- considered already written and the rest of the functions are not called, nor is
- the usual code for writing the file executed.
-
- If the file-precious-flag variable is nil, the file is moved to the backup
- file before any of the hooks are called. If none of the hooks actually write
- the file, but one does return non-nil, the file will not exist, although the
- backup will.
-
- Here is an example showing how to add an element to write-file-hooks but avoid
- adding it twice:
-
- (or (memq 'my-write-file-hook write-file-hooks)
- (setq write-file-hooks
- (cons 'my-write-file-hook write-file-hooks)))
-
- -- Variable: file-precious-flag
- If this variable is non-nil, then save-buffer protects against I/O errors
- while saving by renaming the original file to a temporary name before writing
- the new contents of the file. If the new contents are successfully written,
- the renamed original file is deleted. Otherwise, it is renamed back to the
- original name. This procedure prevents problems such as a lack of disk space
- from resulting in an invalid file.
-
- Some modes set this non-nil locally in particular buffers.
-
- -- User Option: require-final-newline
- This variable determines whether files may be written out that do not end with
- a newline. If the value of the variable is t, then Emacs silently puts a
- newline at the end of the file whenever the buffer being saved does not already
- end in one. If the value of the variable is non-nil, but not t, then Emacs
- asks the user whether to add a newline each time the case arises.
-
- If the value of the variable is nil, then Emacs doesn't add newlines at all.
- nil is the default value, but a few major modes change it to t.
-
-
- ΓòÉΓòÉΓòÉ 25.3. Reading from Files ΓòÉΓòÉΓòÉ
-
- You can copy a file directly from the disk and insert it into a buffer using
- the insert-file-contents function, or its interactive variant, insert-file.
-
- -- Command: insert-file filename
- This function inserts the contents of file filename into the current buffer
- after point, and sets the mark at the end of the inserted text. An error is
- signaled if filename is not the name of a file that can be read. This function
- is for interactive use and does little more than call insert-file-contents.
-
- -- Function: insert-file-contents filename &optional visit
- This function inserts the contents of file filename into the current buffer
- after point. It returns a list of the absolute file name and the length of the
- data inserted. An error is signaled if filename is not the name of a file that
- can be read.
-
- If visit is non-nil, it also marks the buffer as unmodified and sets up
- various fields in the buffer so that it is visiting the file filename: these
- include the buffer's visited file name and its last save file modtime. This
- feature is used by find-file-noselect and you should probably not use it
- yourself.
-
-
- ΓòÉΓòÉΓòÉ 25.4. Writing to Files ΓòÉΓòÉΓòÉ
-
- You can write the contents of a buffer, or part of a buffer, directly to a
- file on disk using the append-to-file and write-region functions. Don't use
- these functions to write to files that are being visited; that could cause
- confusion in the mechanisms for visiting.
-
- -- Command: append-to-file start end filename
- This function appends the contents of the region delimited by start and end in
- the current buffer to the end of file filename. If that file does not exist,
- it is created. This function returns nil.
-
- An error is signaled if filename specifies a nonwritable file, or a
- nonexistent file in a directory where files cannot be created.
-
- -- Command: write-region start end filename &optional append visit
- This function writes the region (of the current buffer) delimited by start and
- end into the file specified by filename.
-
- If append is non-nil, then the region is appended to the existing file contents
- (if any).
-
- If visit is t, then Emacs establishes an association between the buffer and the
- file: the buffer is then visiting that file. It also sets the last file
- modification time for the current buffer to filename's modtime, and marks the
- buffer as not modified. This feature is used by write-file and you should
- probably not use it yourself.
-
- Normally, this function displays a message `Wrote file filename' in the echo
- area. If visit is neither t nor nil, then this message is inhibited. This
- feature is useful for programs that use files for internal purposes, files
- which the user does not need to know about.
-
-
- ΓòÉΓòÉΓòÉ 25.5. File Locks ΓòÉΓòÉΓòÉ
-
- When two users edit the same file at the same time, they are likely to
- interfere with each other. Emacs tries to prevent this situation from arising
- by recording a file lock when a file is being modified. Emacs can then detect
- the first attempt to modify a buffer visiting a file that is locked by another
- Emacs job, and ask the user what to do.
-
- File locks do not work properly when multiple machines can share filesystems,
- such as with NFS. Perhaps a better file locking system will be implemented in
- the future. When file locks do not work, it is possible for two users to make
- changes simultaneously, but Emacs will still be able to warn the user who saves
- second. Also, the detection of modification of a buffer visiting a file
- changed on disk catches some cases of simultaneous editing; see Modification
- Time.
-
- -- Function: file-locked-p filename
- This function returns nil if the file filename is not locked by this Emacs
- process. It returns t if it is locked by this Emacs, and it returns the name
- of the user who has locked it if it is locked by someone else.
-
- (file-locked-p "foo")
- => nil
-
- -- Function: lock-buffer &optional filename
- This function locks the file filename, if the current buffer is modified. The
- argument filename defaults to the current buffer's visited file. Nothing is
- done if the current buffer is not visiting a file, or is not modified.
-
- -- Function: unlock-buffer
- This function unlocks the file being visited in the current buffer, if the
- buffer is modified. If the buffer is not modified, then the file should not be
- locked, so this function does nothing. It also does nothing if the current
- buffer is not visiting a file.
-
- -- Function: ask-user-about-lock file other-user
- This function is called when the user tries to modify file, but it is locked by
- another user name other-user. The value it returns controls what Emacs will do
- with the file:
-
- o A value of t tells Emacs to grab the lock on the file. Then this user may
- edit the file and other-user loses the lock.
-
- o A value of nil tells Emacs to ignore the lock and let this user edit the file
- anyway.
-
- o This function may instead signal a file-locked error, in which case the
- change to the buffer which the user was about to make does not take place.
-
- The error message for this error looks like this:
-
- error--> File is locked: file other-user
-
- where file is the name of the file and other-user is the name of the user who
- has locked the file.
-
- The default definition of this function asks the user to choose what to do.
- If you wish, you can replace the ask-user-about-lock function with your own
- version that decides in another way. The code for its usual definition is in
- `userlock.el'.
-
-
- ΓòÉΓòÉΓòÉ 25.6. Information about Files ΓòÉΓòÉΓòÉ
-
- The functions described in this section are similar in as much as they all
- operate on strings which are interpreted as file names. All have names that
- begin with the word `file'. These functions all return information about
- actual files or directories, so their arguments must all exist as actual files
- or directories unless otherwise noted.
-
- Most of the file-oriented functions take a single argument, filename, which
- must be a string. The file name is expanded using expand-file-name, so `~' is
- handled correctly, as are relative file names (including `../'). Environment
- variable substitutions, such as `$HOME', are not recognized by these functions.
-
-
- ΓòÉΓòÉΓòÉ 25.6.1. Testing Accessibility ΓòÉΓòÉΓòÉ
-
- These functions test for permission to access a file in specific ways.
-
- -- Function: file-exists-p filename
- This function returns t if a file named filename appears to exist. This does
- not mean you can necessarily read the file, only that you can find out its
- attributes. (On Unix, this is true if the file exists and you have execute
- permission on the containing directories, regardless of the protection of the
- file itself.)
-
- If the file does not exist, or if fascist access control policies prevent you
- from finding the attributes of the file, this function returns nil.
-
- -- Function: file-readable-p filename
- This function returns t if a file named filename exists and you can read it.
- It returns nil otherwise.
-
- (file-readable-p "files.texi")
- => t
- (file-exists-p "/usr/spool/mqueue")
- => t
- (file-readable-p "/usr/spool/mqueue")
- => nil
-
- -- Function: file-writable-p filename
- This function returns t if filename can be written or created by you. It is
- writable if the file exists and you can write it. It is creatable if the file
- does not exist, but the specified directory does exist and you can write in
- that directory. file-writable-p returns nil otherwise.
-
- In the third example below, `foo' is not writable because the parent directory
- does not exist, even though the user could create it.
-
- (file-writable-p "~rms/foo")
- => t
- (file-writable-p "/foo")
- => nil
- (file-writable-p "~rms/no-such-dir/foo")
- => nil
-
- -- Function: file-newer-than-file-p filename1 filename2
- This functions returns t if the file filename1 is newer than file filename2.
- If filename1 does not exist, it returns nil. If filename2 does not exist, it
- returns t.
-
- In the following example, assume that the file `aug-19' was written on the
- 19th, and `aug-20' was written on the 20th. The file `no-file' doesn't exist
- at all.
-
- (file-newer-than-file-p "aug-19" "aug-20")
- => nil
- (file-newer-than-file-p "aug-20" "aug-19")
- => t
- (file-newer-than-file-p "aug-19" "no-file")
- => t
- (file-newer-than-file-p "no-file" "aug-19")
- => nil
-
-
- ΓòÉΓòÉΓòÉ 25.6.2. Distinguishing Kinds of Files ΓòÉΓòÉΓòÉ
-
- This section describes how to distinguish directories and symbolic links from
- ordinary files.
-
- -- Function: file-symlink-p filename
- If filename is a symbolic link, the file-symlink-p function returns the file
- name to which it is linked. This may be the name of a text file, a directory,
- or even another symbolic link, or of no file at all.
-
- If filename is not a symbolic link (or there is no such file), file-symlink-p
- returns nil.
-
- (file-symlink-p "foo")
- => nil
- (file-symlink-p "sym-link")
- => "foo"
- (file-symlink-p "sym-link2")
- => "sym-link"
- (file-symlink-p "/bin")
- => "/pub/bin"
-
- -- Function: file-directory-p filename
- This function returns t if filename is the name of an existing directory, nil
- otherwise.
-
- (file-directory-p "~rms")
- => t
- (file-directory-p "~rms/lewis/files.texi")
- => nil
- (file-directory-p "~rms/lewis/no-such-file")
- => nil
- (file-directory-p "$HOME")
- => nil
- (file-directory-p (substitute-in-file-name "$HOME"))
- => t
-
-
- ΓòÉΓòÉΓòÉ 25.6.3. Other Information about Files ΓòÉΓòÉΓòÉ
-
- This section describes the functions for getting detailed information about a
- file, other than its contents. This information includes the mode bits that
- control access permission, the owner and group numbers, the number of names,
- the inode number, the size, and the times of access and modification.
-
- -- Function: file-modes filename
- This function returns the mode bits of filename, as an integer. The mode bits
- are also called the file permissions, and they specify access control in the
- usual Unix fashion. If the low-order bit is 1, then the file is executable by
- all users, if the second lowest-order bit is 1, then the file is writable by
- all users, etc.
-
- The highest value returnable is 4095 (7777 octal), meaning that everyone has
- read, write, and execute permission, that the suid bit is set for both others
- and group, and that the sticky bit is set.
-
- (file-modes "~/junk/diffs")
- => 492 ; decimal integer
- (format "%o" 492)
- => 754 ; convert to octal
-
- (set-file-modes "~/junk/diffs" 438)
- => nil
-
- (format "%o" 438)
- => 666 ; convert to octal
-
- % ls -l diffs
- -rw-rw-rw- 1 lewis 0 3063 Oct 30 16:00 diffs
-
- -- Function: file-nlinks filename
- This functions returns the number of names (i.e., hard links) that file
- filename has. If the file does not exist, then this function returns nil.
- Note that symbolic links have no effect on this function, because they are not
- considered to be names of the files they link to.
-
- % ls -l foo*
- -rw-rw-rw- 2 rms 4 Aug 19 01:27 foo
- -rw-rw-rw- 2 rms 4 Aug 19 01:27 foo1
-
- (file-nlinks "foo")
- => 2
- (file-nlinks "doesnt-exist")
- => nil
-
- -- Function: file-attributes filename
- This function returns a list of attributes of file filename. If the specified
- file cannot be opened, it returns nil.
-
- The elements of the list, in order, are:
-
- 1. t for a directory, a string for a symbolic link (the name linked to), or
- nil for a text file.
-
- 2. The number of names the file has. Alternate names, also known as hard
- links, can be created with add-name-to-file ( see Changing File
- Attributes).
-
- 3. The file's uid.
-
- 4. The file's gid.
-
- 5. The time of last access, as a list of two integers. The first integer has
- the high-order 16 bits of time, the second has the low 16 bits.
-
- 6. The time of last modification as a list of two integers (as above).
-
- 7. The time of last status change as a list of two integers (as above).
-
- 8. The size of the file in bytes.
-
- 9. The file's modes, as a string of ten letters or dashes as in `ls -l'.
-
- 10. t if the file's gid would change if file were deleted and recreated; nil
- otherwise.
-
- 11. The file's inode number.
-
- For example, here are the file attributes for `files.texi':
-
- (file-attributes "files.texi")
- => (nil
- 1
- 2235
- 75
- (8489 20284)
- (8489 20284)
- (8489 20285)
- 14906
- "-rw-rw-rw-"
- nil
- 20920)
-
- and here is how the result is interpreted:
-
- nil
- is neither a directory nor a symbolic link.
-
- 1
- has only one name (the name `files.texi' in the current default
- directory).
-
- 2235
- is owned by the user with uid 2235.
-
- 75
- is in the group with gid 75.
-
- (8489 20284)
- was last accessed on Aug 19 00:09. Unfortunately, you cannot convert
- this number into a time string in Emacs.
-
- (8489 20284)
- was last accessed on Aug 19 00:09.
-
- (8489 20285)
- last had its inode changed on Aug 19 00:09.
-
- 14906
- is 14906 characters long.
-
- "-rw-rw-rw-"
- has a mode of read and write access for the owner, group, and world.
-
- nil
- would retain the same gid if it were recreated.
-
- 20920
- has an inode number of 20920.
-
-
- ΓòÉΓòÉΓòÉ 25.7. Contents of Directories ΓòÉΓòÉΓòÉ
-
- A directory is a kind of file that contains other files entered under various
- names. Directories are a feature of the file system.
-
- Emacs can list the names of the files in a directory as a Lisp list, or
- display the names in a buffer using the ls shell command. In the latter case,
- it can optionally display information about each file, depending on the value
- of switches passed to the ls command.
-
- -- Function: directory-files directory &optional full-name match-regexp
- This function returns a list of the names of the files in the directory
- directory.
-
- If full-name is non-nil, the function returns the files' absolute file names.
- Otherwise, it returns just the names relative to the specified directory.
-
- If match-regexp is non-nil, function returns only those file names that contain
- that regular expression---the other file names are discarded from the list.
-
- (directory-files "~lewis")
- => ("#foo#" "#foo.el#" "." ".."
- "dired-mods.el" "files.texi" "files.texi.~1~")
-
- An error is signaled if directory is not the name of a directory that can be
- read.
-
- -- Function: file-name-all-versions file dirname
- This function returns a list of all versions of the file named file in
- directory dirname.
-
- -- Command: list-directory filespec &optional verbose
- This command displays a list of files in or matching filespec. It calls the
- shell command ls, passing it options under the control of verbose.
-
- The argument filespec may be either a directory name or a file name containing
- optional wildcards. Wildcards are processed by the shell.
-
- The options passed to ls are the value of list-directory-verbose-switches if
- verbose is non-nil; list-directory-brief-switches otherwise. Interactively, the
- raw prefix argument is used for verbose.
-
- -- Variable: list-directory-brief-switches
- This variable contains switches for list-directory to pass to ls for a short
- or ``brief'' listing. The default value is "-CF".
-
- -- Variable: list-directory-verbose-switches
- This variable contains switches for list-directory to pass to ls for a verbose
- or ``long'' listing. The default value is "-l".
-
-
- ΓòÉΓòÉΓòÉ 25.8. Changing File Names and Attributes ΓòÉΓòÉΓòÉ
-
- The functions in this section rename, copy, delete, link, and set the modes of
- files.
-
- In the functions that have an argument newname, if a file by the name of
- newname already exists, the actions taken depend on the value of the argument
- ok-if-already-exists:
-
- o A file-already-exists error is signaled if ok-if-already-exists is nil.
-
- o Confirmation is requested if ok-if-already-exists is a number.
-
- o No confirmation is requested if ok-if-already-exists is any other value, in
- which case the old file is removed.
-
- -- Function: add-name-to-file oldname newname &optional ok-if-already-exists
- This function gives the file named oldname the additional name newname. This
- means that newname will be a new ``hard link'' to oldname.
-
- In the first part of the following example, we list two files, `foo' and
- `foo3'.
-
- % ls -l fo*
- -rw-rw-rw- 1 rms 29 Aug 18 20:32 foo
- -rw-rw-rw- 1 rms 24 Aug 18 20:31 foo3
-
- Then we evaluate the form (add-name-to-file "~/lewis/foo" "~/lewis/foo2").
- Again we list the files. This shows two names, `foo' and `foo2'.
-
- (add-name-to-file "~/lewis/foo1" "~/lewis/foo2")
- => nil
-
- % ls -l fo*
- -rw-rw-rw- 2 rms 29 Aug 18 20:32 foo
- -rw-rw-rw- 2 rms 29 Aug 18 20:32 foo2
- -rw-rw-rw- 1 rms 24 Aug 18 20:31 foo3
-
- Finally, we evaluate (add-name-to-file "~/lewis/foo" "~/lewis/foo3" t), and
- list the files again. Now there are three names for one file: `foo', `foo2',
- and `foo3'. The old contents of `foo3' are lost.
-
- (add-name-to-file "~/lewis/foo1" "~/lewis/foo3")
- => nil
-
- % ls -l fo*
- -rw-rw-rw- 3 rms 29 Aug 18 20:32 foo
- -rw-rw-rw- 3 rms 29 Aug 18 20:32 foo2
- -rw-rw-rw- 3 rms 29 Aug 18 20:32 foo3
-
- This function is meaningless on VMS, where multiple names for one file are not
- allowed.
-
- See also file-nlinks in Information about Files.
-
- -- Command: rename-file filename newname &optional ok-if-already-exists
- This command renames the file filename as newname.
-
- If filename has additional names aside from filename, it continues to have
- those names. In fact, adding the name newname with add-name-to-file and then
- deleting filename has the same effect as renaming, aside from momentary
- intermediate states.
-
- In an interactive call, this function prompts for filename and newname in the
- minibuffer; also, it requests confirmation if newname already exists.
-
- -- Command: copy-file oldname newname &optional ok-if-exists time
- This command copies the file oldname to newname. An error is signaled if
- oldname does not exist.
-
- If time is non-nil, then this functions gives the new file the same
- last-modified time that the old one has. (This works on only some operating
- systems.)
-
- In an interactive call, this function prompts for filename and newname in the
- minibuffer; also, it requests confirmation if newname already exists.
-
- -- Command: delete-file filename
- This command deletes the file filename, like the shell command `rm filename'.
- If the file has multiple names, it continues to exist under the other names.
-
- A suitable kind of file-error error is signaled if the file does not exist, or
- is not deletable. (In Unix, a file is deletable if its directory is writable.)
-
- -- Command: make-symbolic-link filename newname &optional ok-if-exists
- This command makes a symbolic link to filename, named newname. This is like
- the shell command `ln -s filename newname'.
-
- In an interactive call, filename and newname are read in the minibuffer, and
- ok-if-exists is set to the numeric prefix argument.
-
- -- Function: set-file-modes filename mode
- This function sets mode bits of filename to mode (which must be a integer).
- Only the 12 low bits of mode are used.
-
-
- ΓòÉΓòÉΓòÉ 25.9. File Names ΓòÉΓòÉΓòÉ
-
- Files are generally referred to by their names, in Emacs as elsewhere. File
- names in Emacs are represented as strings. The functions that operate on a
- file all expect a file name argument.
-
- In addition to operating on files themselves, Emacs Lisp programs often need
- to operate on the names; i.e., to take them apart and to use part of a name to
- construct related file names. This section describes how to manipulate file
- names.
-
- The functions in this section do not actually access files, so they can
- operate on file names that do not refer to an existing file or directory.
-
- On VMS, all these functions understand both VMS file name syntax and Unix
- syntax. This is so that all the standard Lisp libraries can specify file names
- in Unix syntax and work properly on VMS without change.
-
-
- ΓòÉΓòÉΓòÉ 25.9.1. File Name Components ΓòÉΓòÉΓòÉ
-
- The operating system groups files into directories. To specify a file, you
- must specify the directory, and the file's name in that directory. Therefore,
- a file name in Emacs is considered to have two main parts: the directory name
- part, and the nondirectory part (or file name within the directory). Either
- part may be empty. Concatenating these two parts reproduces the original file
- name.
-
- On Unix, the directory part is everything up to and including the last slash;
- the nondirectory part is the rest. The rules in VMS syntax are complicated.
-
- For some purposes, the nondirectory part is further subdivided into the name
- and the version number. On Unix, only backup files have version numbers in
- their names; on VMS, every file has a version number, but most of the time the
- file name actually used in Emacs omits the version number. Version numbers are
- found mostly in directory lists.
-
- -- Function: file-name-directory filename
- This function returns the directory part of filename (or nil if filename does
- not include a directory part). On Unix, the function returns a string ending
- in a slash. On VMS, it returns a string ending in one of the three characters
- `:', `]', or `>'.
-
- (file-name-directory "lewis/foo") ; Unix example
- => "lewis/"
- (file-name-directory "foo") ; Unix example
- => nil
- (file-name-directory "[X]FOO.TMP") ; VMS example
- => "[X]"
-
- -- Function: file-name-nondirectory filename
- This function returns the nondirectory part of filename.
-
- (file-name-nondirectory "lewis/foo")
- => "foo"
- (file-name-nondirectory "foo")
- => "foo"
- ;; The following example is accurate only on VMS.
- (file-name-nondirectory "[X]FOO.TMP")
- => "FOO.TMP"
-
- -- Function: file-name-sans-versions filename
- This function returns filename without any file version numbers, backup
- version numbers, or trailing tildes.
-
- (file-name-sans-versions "~rms/foo.~1~")
- => "~rms/foo"
- (file-name-sans-versions "~rms/foo~")
- => "~rms/foo"
- (file-name-sans-versions "~rms/foo")
- => "~rms/foo"
- ;; The following example applies to VMS only.
- (file-name-sans-versions "foo;23")
- => "foo"
-
-
- ΓòÉΓòÉΓòÉ 25.9.2. Directory Names ΓòÉΓòÉΓòÉ
-
- A directory name is the name of a directory. A directory is a kind of file,
- and it has a file name, which is related to the directory name but not
- identical to it. (This is not quite the same as the usual Unix terminology.)
- These two different names for the same entity are related by a syntactic
- transformation. On Unix, this is simple: a directory name ends in a slash,
- whereas the directory's name as a file lacks that slash. On VMS, the
- relationship is more complicated.
-
- The difference between a directory name and its name as a file is subtle but
- crucial. When an Emacs variable or function argument is described as being a
- directory name, a file name of a directory is not acceptable.
-
- All of these functions take a single argument, filename, which must be a
- string. Environment variable substitutions such as `$HOME', and the symbols
- `~', and `..', are not expanded. Use expand-file-name or
- substitute-in-file-name for that (see File Name Expansion).
-
- -- Function: file-name-as-directory filename
- This function returns a string representing filename in a form that the
- operating system will interpret as the name of a directory. In Unix, this
- means that a slash is appended to the string. On VMS, the function converts a
- string of the form `[X]Y.DIR.1' to the form `[X.Y]'.
-
- (file-name-as-directory "~rms/lewis")
- => "~rms/lewis/"
-
- -- Function: directory-file-name dirname
- This function returns a string representing dirname in a form that the
- operating system will interpret as the name of a file. On Unix, this means
- that a final slash is removed from the string. On VMS, the function converts a
- string of the form `[X.Y]' to `[X]Y.DIR.1'.
-
- (directory-file-name "~lewis/")
- => "~lewis"
-
-
- ΓòÉΓòÉΓòÉ 25.9.3. Absolute and Relative File Names ΓòÉΓòÉΓòÉ
-
- All the directories in the file system form a tree starting at the root
- directory. A file name can specify all the directory names starting from the
- root of the tree; then it is called an absolute file name. Or it can specify
- the position of the file in the tree relative to a default directory; then it
- is called an relative file name. On Unix, an absolute file name starts with a
- slash or a tilde (`~'), and a relative one does not. The rules on VMS are
- complicated.
-
- -- Function: file-name-absolute-p filename
- This function returns t if file filename is an absolute file name, nil
- otherwise. On VMS, this function understands both Unix syntax and VMS syntax.
-
- (file-name-absolute-p "~rms/foo")
- => t
- (file-name-absolute-p "rms/foo")
- => nil
- (file-name-absolute-p "$HOME")
- => nil
- (file-name-absolute-p "/user/rms/foo")
- => t
-
-
- ΓòÉΓòÉΓòÉ 25.9.4. Functions that Expand Filenames ΓòÉΓòÉΓòÉ
-
- Expansion of a file name means converting a relative file name to an absolute
- one. Since this is done relative to a default directory, you must specify the
- default directory name as well as the file name to be expanded. Expansion also
- canonicalizes file names by eliminating redundancies such as `./' and
- `name/../'.
-
- -- Function: expand-file-name filename &optional directory
- This function converts filename to an absolute file name. If directory is
- supplied, it is the directory to start with if filename is relative.
- Otherwise, the current buffer's value of default-directory is used. For
- example:
-
- (expand-file-name "foo")
- => "/xcssun/users/rms/lewis/foo"
- (expand-file-name "../foo")
- => "/xcssun/users/rms/foo"
- (expand-file-name "foo" "/usr/spool")
- => "/usr/spool/foo"
- (expand-file-name "$HOME/foo")
- => "/xcssun/users/rms/lewis/$HOME/foo"
-
- Filenames containing `.' or `..' are simplified to their canonical form:
-
- (expand-file-name "bar/../foo")
- => "/xcssun/users/rms/lewis/foo"
-
- `~/' is expanded into the user's home directory. A `/' or `~' following a `/'
- is taken to be the start of an absolute file name that overrides what precedes
- it, so everything before that `/' or `~' is deleted. For example:
-
- (expand-file-name "/a1/gnu//usr/local/lib/emacs/etc/MACHINES")
- => "/usr/local/lib/emacs/etc/MACHINES"
- (expand-file-name "/a1/gnu/~/foo")
- => "/xcssun/users/rms/foo"
-
- In both cases, `/a1/gnu/' has been discarded because an absolute file name
- follows it.
-
- Note that expand-file-name does not expand environment variables; that is done
- only by substitute-in-file-name.
-
- -- Variable: default-directory
- The value of this buffer-local variable is the default directory for the
- current buffer. It is local in every buffer. expand-file-name uses the default
- directory when its second argument is nil.
-
- On Unix systems, the value is always a string ending with a slash.
-
- default-directory
- => "/user/lewis/manual/"
-
- -- Function: substitute-in-file-name filename
- This function replaces environment variables names in filename with the values
- to which they are set by the operating system. Following standard Unix shell
- syntax, `$' is the prefix to substitute an environment variable value.
-
- The environment variable name is the series of alphanumeric characters
- (including underscores) that follow the `$'. If the character following the
- `$' is a `{', then the variable name is everything up to the matching `}'.
-
- Here we assume that the environment variable HOME, which holds the user's home
- directory name, has the value `/xcssun/users/rms'.
-
- (substitute-in-file-name "$HOME/foo")
- => "/xcssun/users/rms/foo"
-
- If a `~' or a `/' appears following a `/', after substitution, everything
- before the following `/' is discarded:
-
- (substitute-in-file-name "bar/~/foo")
- => "~/foo"
- (substitute-in-file-name "/usr/local/$HOME/foo")
- => "/xcssun/users/rms/foo"
-
- On VMS, `$' substitution is not done, so this function does nothing on VMS
- except discard superfluous initial components as shown above.
-
-
- ΓòÉΓòÉΓòÉ 25.9.5. Generating Unique File Names ΓòÉΓòÉΓòÉ
-
- Some programs need to write temporary files. Here is the usual way to
- construct a name for such a file:
-
- (concat "/tmp/" (make-temp-name name-of-application))
-
- The directory `/tmp/' is chosen because that is the standard place on Unix for
- temporary files. The task of make-temp-name is to prevent two different users
- or two different jobs from trying to use the same name.
-
- -- Function: make-temp-name string
- This function generates string that can be used as a unique name. The name will
- start with the prefix string, and finish with a number that is different in
- each Emacs job.
-
- (make-temp-name "foo")
- => "foo021304"
- (make-temp-name "foo")
- => "foo021304"
-
- To prevent conflicts among different application libraries run in the same
- Emacs, each application should have its own string. The number added to the
- end of the name distinguishes between the same application running in different
- Emacses.
-
-
- ΓòÉΓòÉΓòÉ 25.9.6. File Name Completion ΓòÉΓòÉΓòÉ
-
- This section describes low-level subroutines for completing a file name. For
- other completion functions, see Completion.
-
- -- Function: file-name-all-completions partial-filename directory
- This function returns a list of all possible completions for a file whose name
- starts with partial-filename in directory directory. The order of the
- completions is the order of the files in the directory, which is unpredictable
- and conveys no useful information.
-
- The argument partial-filename must be a file name containing no directory part
- and no slash. The current buffer's default directory is prepended to
- directory, if directory is not an absolute file name.
-
- In the following example, suppose that the current default directory,
- `~rms/lewis', has five files whose names begin with `f': `foo', `file~',
- `file.c', `file.c.~1~', and `file.c.~2~'.
-
- (file-name-all-completions "f" "")
- => ("foo" "file~" "file.c.~2~" "file.c.~1~" "file.c")
-
- (file-name-all-completions "fo" "")
- => ("foo")
-
- -- Function: file-name-completion filename directory
- This function completes the file name filename in directory directory. It
- returns the longest prefix common to all file names in directory directory that
- start with filename.
-
- If only one match exists and filename matches it exactly, the function returns
- t. The function returns nil if directory directory contains no name starting
- with filename.
-
- In the following example, suppose that the current default directory has five
- files whose names begin with `f': `foo', `file~', `file.c', `file.c.~1~', and
- `file.c.~2~'.
-
- (file-name-completion "fi" "")
- => "file"
-
- (file-name-completion "file.c.~1" "")
- => "file.c.~1~"
-
- (file-name-completion "file.c.~1~" "")
- => t
-
- (file-name-completion "file.c.~3" "")
- => nil
-
- -- User Option: completion-ignored-extensions
- file-name-completion usually ignores file names that end in any string in this
- list. It does not ignore them when all the possible completions end in one of
- these suffixes or when a buffer showing all possible completions is displayed.
-
- A typical value might look like this:
-
- completion-ignored-extensions
- => (".o" ".elc" "~" ".dvi")
-
-
- ΓòÉΓòÉΓòÉ 26. Backups and Auto-Saving ΓòÉΓòÉΓòÉ
-
- Backup files and auto-save files are two methods by which Emacs tries to
- protect the user from the consequences of crashes or of the user's own errors.
- Auto-saving preserves the text from earlier in the current editing session;
- backup files preserve file contents prior to the current session.
-
-
- ΓòÉΓòÉΓòÉ 26.1. Backup Files ΓòÉΓòÉΓòÉ
-
- A backup file is a copy of the old contents of a file you are editing. Emacs
- makes a backup file the first time you save a buffer into its visited file.
- Normally, this means that the backup file contains the contents of the file as
- it was before the current editing session. The contents of the backup file
- normally remain unchanged once it exists.
-
- Backups are usually made by renaming the visited file to a new name.
- Optionally, you can specify that backup files should be made by copying the
- visited file. This choice makes a difference for files with multiple names; it
- also can affect whether the edited file remains owned by the original owner or
- becomes owned by the user editing it.
-
- By default, Emacs makes a single backup file for each file edited. You can
- alternatively request numbered backups; then each new backup file gets a new
- name. You can delete old numbered backups when you don't want them any more,
- or Emacs can delete them automatically.
-
-
- ΓòÉΓòÉΓòÉ 26.1.1. Making Backup Files ΓòÉΓòÉΓòÉ
-
- -- Function: backup-buffer
- This function makes a backup of the file visited by the current buffer, if
- appropriate. It is called by save-buffer before saving the buffer the first
- time.
-
- -- Variable: buffer-backed-up
- This buffer-local variable indicates whether this buffer's file has been
- backed up on account of this buffer. If it is non-nil, then the backup file
- has been written. Otherwise, the file should be backed up when it is next
- saved (if backup files are enabled).
-
- -- Variable: make-backup-files
- This variable determines whether or not backup files will be created. If it is
- non-nil, then Emacs will create a backup of each file when it is saved for the
- first time.
-
- The following example shows how to change the make-backup-files variable only
- in the `RMAIL' buffer and not elsewhere. Setting it nil stops Emacs from
- making backups of the `RMAIL' file, which may save disk space. (You would put
- this code in your `.emacs' file.)
-
- (setq rmail-mode-hook
- (function (lambda ()
- (make-local-variable 'make-backup-files)
- (setq make-backup-files nil)))
-
-
- ΓòÉΓòÉΓòÉ 26.1.2. Backup by Renaming or by Copying? ΓòÉΓòÉΓòÉ
-
- There are two ways that Emacs can make a backup file:
-
- o Emacs can rename the original file so that it becomes a backup file, and then
- write the buffer being saved into a new file. In this case, any other names
- (i.e., hard links) of the original file will now refer to the backup file.
- The new file will be owned by the user doing the editing, and its group will
- be the default for the user or the directory.
-
- o Emacs can copy the original file into a backup file, and then overwrite the
- original file with new contents. In this case, any other names (i.e., hard
- links) of the original file will still refer to the current version of the
- file. The file's owner and group will be unchanged.
-
- The first method, renaming, is the default.
-
- The variable backup-by-copying, if non-nil, says to use the second method,
- which is to copy the original file and overwrite it with the new buffer
- contents. The variable file-precious-flag, if non-nil, also has this effect
- (as a sideline of its main significance). See Saving Buffers.
-
- The variables backup-by-copying-when-linked and
- backup-by-copying-when-mismatch, if non-nil, cause the second method to be used
- in certain special cases. They have no effect on the treatment of files that
- don't fall into the special cases.
-
- -- Variable: backup-by-copying
- This variable controls whether to make backup files by copying. If it is
- non-nil, then Emacs always copies the current contents of the file into the
- backup file before writing the buffer to be saved to the file. (In many
- circumstances, this has the same effect as file-precious-flag.)
-
- -- Variable: backup-by-copying-when-linked
- This variable controls whether to make backups by copying for files with
- multiple names (hard links). If it is non-nil, then Emacs will use copying to
- create backups for those files.
-
- This variable is significant only if backup-by-copying is nil, since copying
- is always used when that variable is non-nil.
-
- -- Variable: backup-by-copying-when-mismatch
- This variable controls whether to make backups by copying when renaming would
- cause either the owner or the group of the file to change. If it is non-nil
- then Emacs will create backups by copying in such cases.
-
- The value has no effect when renaming would not result in changing the owner
- or group of the file; that is, for files which are owned by the user and whose
- group matches the default for a new file created there by the user.
-
- This variable is significant only if backup-by-copying is nil, since copying
- is always used when that variable is non-nil.
-
-
- ΓòÉΓòÉΓòÉ 26.1.3. Making and Deleting Numbered Backup Files ΓòÉΓòÉΓòÉ
-
- If a file's name is `foo', the names of its numbered backup versions are
- `foo.~v~', for various integers v, like this: `foo.~1~', `foo.~2~', `foo.~3~',
- ..., `foo.~259~', and so on.
-
- -- User Option: version-control
- This variable controls whether to make a single non-numbered backup file or
- multiple numbered backups.
-
- nil
- Make numbered backups if the visited file already has numbered
- backups; otherwise, do not.
-
- never
- Do not make numbered backups.
-
- anything else
- Do make numbered backups.
-
- The use of numbered backups ultimately leads to a large number of backup
- versions, which must then be deleted. Emacs can do this automatically.
-
- -- User Option: kept-new-versions
- The value of this variable is the number of oldest versions to keep when a new
- numbered backup is made. The newly made backup is included in the count. The
- default value is 2.
-
- -- User Option: kept-old-versions
- The value of this variable is the number of oldest versions to keep when a new
- numbered backup is made. The default value is 2.
-
- -- User Option: dired-kept-versions
- This variable plays a role in Dired's dired-clean-directory (.) command like
- that played by kept-old-versions when a backup file is made. The default value
- is 2.
-
- If there are backups numbered 1, 2, 3, 5, and 7, and both of these variables
- have the value 2, then the backups numbered 1 and 2 will be kept as old
- versions and those numbered 5 and 7 will be kept as new versions; backup
- version 3 will be deleted. The function find-backup-file-name is responsible
- for determining which backup versions to delete, but does not delete them
- itself.
-
- -- User Option: trim-versions-without-asking
- If this variable is non-nil, then excess backup versions are deleted silently.
- Otherwise, the user is asked whether to delete them.
-
-
- ΓòÉΓòÉΓòÉ 26.1.4. Naming Backup Files ΓòÉΓòÉΓòÉ
-
- The functions in this section are documented mainly because you can customize
- the naming conventions for backup files by redefining them.
-
- -- Function: backup-file-name-p filename
- This function returns a non-nil value if filename is a possible name for a
- backup file. A file with the name filename need not exist; the function just
- checks the name.
-
- (backup-file-name-p "foo")
- => nil
- (backup-file-name-p "foo~")
- => 3
-
- The standard definition of this function is as follows:
-
- (defun backup-file-name-p (file)
- "Return non-nil if FILE is a backup file name (numeric or not)..."
- (string-match "~$" file))
-
- Thus, the function returns a non-nil value if the file name ends with a `~'
-
- This simple expression is placed in a separate function to make it easy to
- redefine for customization.
-
- -- Function: make-backup-file-name filename
- This function returns a string which is the name to use for a non-numbered
- backup file for file filename. On Unix, this is just filename with a tilde
- appended.
-
- The standard definition of this function is as follows:
-
- (defun make-backup-file-name (file)
- "Create the non-numeric backup file name for FILE..."
- (concat file "~"))
-
- You can change the backup file naming convention by redefining this function.
- In the following example, make-backup-file-name is redefined to prepend a `.'
- as well as to append a tilde.
-
- (defun make-backup-file-name (filename)
- (concat "." filename "~"))
-
- (make-backup-file-name "backups.texi")
- => ".backups.texi~"
-
- If you do redefine make-backup-file-name, be sure to redefine
- backup-file-name-p and find-backup-file-name as well.
-
- -- Function: find-backup-file-name filename
- This function computes the file name for a new backup file for filename. It
- may also propose certain existing backup files for deletion.
- find-backup-file-name returns a list whose car is the name for the new backup
- file and whose cdr is a list of backup files whose deletion is proposed.
-
- Two variables called kept-old-versions and kept-new-versions determine which
- old backup versions will be kept (by excluding them from the list of backup
- files ripe for deletion). See Numbered Backups.
-
- In this example, `~rms/foo.~5~' is the name to use for the new backup file,
- and `~rms/foo.~3~' is an ``excess'' version that the caller should consider
- deleting now.
-
- (find-backup-file-name "~rms/foo")
- => ("~rms/foo.~5~" "~rms/foo.~3~")
-
-
- ΓòÉΓòÉΓòÉ 26.2. Auto-Saving ΓòÉΓòÉΓòÉ
-
- Emacs periodically saves all files that you are visiting; this is called
- auto-saving. Auto-saving prevents you from losing more than a limited amount
- of work if the system crashes. By default, auto-saves happen every 300
- keystrokes. See Auto-Saving: Protection Against Disasters, for information on
- auto-save for users. Here we describe the functions used to implement
- auto-saving and the variables that control them.
-
- -- Variable: buffer-auto-save-file-name
- This buffer-local variable is the name of the file used for auto-saving the
- current buffer. It is nil if the buffer should not be auto-saved.
-
- buffer-auto-save-file-name
- => "/xcssun/users/rms/lewis/#files.texi#"
-
- -- Command: auto-save-mode arg
- When used interactively without an argument, this command is a toggle switch:
- it turns on auto-saving of the current buffer if it is off, and vice-versa.
- With an argument arg, the command turns auto-saving on if the value of arg is
- t, a nonempty list, or a positive integer. Otherwise, it turns auto-saving
- off.
-
- -- Function: auto-save-file-name-p filename
- This function returns a non-nil value if filename is a string that could be
- the name of an auto-save file. It works based on knowledge of the naming
- convention for auto-save files: a name that begins and ends with hash marks
- (`#') is a possible auto-save file name. The argument filename should not
- contain a directory part.
-
- (make-auto-save-file-name)
- => "/xcssun/users/rms/lewis/#files.texi#"
- (auto-save-file-name-p "#files.texi#")
- => 0
- (auto-save-file-name-p "files.texi")
- => nil
-
- The standard definition of this function is as follows:
-
- (defun auto-save-file-name-p (filename)
- "Return non-nil if FILENAME can be yielded by..."
- (string-match "^#.*#$" filename))
-
- This function exists so that you can customize it if you wish to change the
- naming convention for auto-save files. If you redefine it, be sure to redefine
- make-auto-save-file-name correspondingly.
-
- -- Function: make-auto-save-file-name
- This function returns the file name to use for auto-saving the current buffer.
- This is just the file name with hash marks (`#') appended and prepended to it.
- This function does not look at the variable auto-save-visited-file-name; that
- should be checked before this function is called.
-
- (make-auto-save-file-name)
- => "/xcssun/users/rms/lewis/#backup.texi#"
-
- The standard definition of this function is as follows:
-
- (defun make-auto-save-file-name ()
- "Return file name to use for auto-saves of current buffer..."
- (if buffer-file-name
- (concat (file-name-directory buffer-file-name)
- "#"
- (file-name-nondirectory buffer-file-name)
- "#")
- (expand-file-name (concat "#%" (buffer-name) "#"))))
-
- This exists as a separate function so that you can redefine it to customize
- the naming convention for auto-save files. Be sure to change
- auto-save-file-name-p in a corresponding way.
-
- -- Variable: auto-save-visited-file-name
- If this variable is non-nil, Emacs will auto-save buffers in the files they
- are visiting. That is, the auto-save is done in the same file which you are
- editing. Normally, this variable is nil, so auto-save files have distinct
- names that are created by make-auto-save-file-name.
-
- When you change the value of this variable, the value does not take effect
- until the next time auto-save mode is reenabled in any given buffer. If
- auto-save mode is already enabled, auto-saves continue to go in the same file
- name until auto-save-mode is called again.
-
- -- Function: recent-auto-save-p
- This function returns t if the current buffer has been auto-saved since the
- last time it was read in or saved.
-
- -- Function: set-buffer-auto-saved
- This function marks the current buffer as auto-saved. The buffer will not be
- auto-saved again until the buffer text is changed again. The function returns
- nil.
-
- -- User Option: auto-save-interval
- The value of this variable is the number of characters that Emacs reads from
- the keyboard between auto-saves. Each time this many more characters are read,
- auto-saving is done for all buffers in which it is enabled.
-
- -- User Option: auto-save-default
- If this variable is non-nil, buffers that are visiting files have auto-saving
- enabled by default. Otherwise, they do not.
-
- -- Command: do-auto-save &optional no-message
- This function auto-saves all buffers that need to be auto-saved. This is all
- buffers for which auto-saving is enabled and that have been changed since the
- last time they were auto-saved.
-
- Normally, if any buffers are auto-saved, a message `Auto-saving...' is
- displayed in the echo area while auto-saving is going on. However, if
- no-message is non-nil, the message is inhibited.
-
- -- Function: delete-auto-save-file-if-necessary
- This function deletes the auto-save file for the current buffer if variable
- delete-auto-save-files is non-nil. It is called every time a buffer is saved.
-
- -- Variable: delete-auto-save-files
- This variable is used by the function delete-auto-save-file-if-necessary. If
- it is non-nil, Emacs will delete auto-save files when a true save is done (in
- the visited file). This saves on disk space and unclutters your directory.
-
- -- Function: rename-auto-save-file
- This function adjusts the current buffer's auto-save file name if the visited
- file name has changed. It also renames an existing auto-save file. If the
- visited file name has not changed, this function does nothing.
-
-
- ΓòÉΓòÉΓòÉ 26.3. Reverting ΓòÉΓòÉΓòÉ
-
- If you have made extensive changes to a file and then change your mind about
- them, you can get rid of them by reading in the previous version of the file
- with the revert-buffer command. See Reverting a Buffer.
-
- -- Command: revert-buffer &optional no-auto-save-offer-p noconfirm
- This command replaces the buffer text with the text of the visited file on
- disk. This action undoes all changes since the file was visited or saved.
-
- When the value of the no-auto-save-offer-p argument is nil, and the latest
- auto-save file is more recent than the visited file, revert-buffer asks the
- user whether to use that instead. Otherwise, it always uses the latest backup
- file. This argument is the numeric prefix argument when the function is called
- interactively.
-
- When the value of the noconfirm argument is non-nil, revert-buffer does not
- ask for confirmation for the reversion action. This means that the buffer
- contents are deleted and replaced by the text from the file on the disk, with
- no further opportunities for the user to prevent it.
-
- Since reverting works by deleting the entire text of the buffer and inserting
- the file contents, all the buffer's markers are relocated to point at the
- beginning of the buffer. This is not ``correct'', but then, there is no way to
- determine what would be correct. It is not possible to determine, from the
- text before and after, which characters after reversion correspond to which
- characters before.
-
- If the value of the revert-buffer-function variable is non-nil, it is called
- as a function with no arguments to do the work.
-
- -- Variable: revert-buffer-function
- The value of this variable is the function to use to revert this buffer; but
- if the value of this variable is nil, then the revert-buffer function carries
- out its default action. Modes such as Dired mode, in which the text being
- edited does not consist of a file's contents but can be regenerated in some
- other fashion, give this variable a buffer-local value that is a function to
- regenerate the contents.
-
- -- Command: recover-file filename
- This function visits filename, but gets the contents from its last auto-save
- file. This is useful after the system has crashed, to resume editing the same
- file without losing all the work done in the previous session.
-
- An error is signaled if there is no auto-save file for filename, or if
- filename is newer than its auto-save file. If filename does not exist, but its
- auto-save file does, then the auto-save file is read as usual. This last
- situation may occur if you visited a nonexistent file and never actually saved
- it.
-
-
- ΓòÉΓòÉΓòÉ 27. Buffers ΓòÉΓòÉΓòÉ
-
- A buffer is a Lisp object containing text to be edited. Buffers are used to
- hold the contents of files that are being visited; there may also be buffers
- which are not visiting files. While several buffers may exist at one time,
- exactly one buffer is designated the current buffer at any time. Most editing
- commands act on the contents of the current buffer. Each buffer, including the
- current buffer, may or may not be displayed in any windows.
-
-
- ΓòÉΓòÉΓòÉ 27.1. Buffer Basics ΓòÉΓòÉΓòÉ
-
- A buffer is a Lisp object containing text to be edited. Buffers are used to
- hold the contents of files that are being visited; there may also be buffers
- which are not visiting files. While several buffers may exist at one time,
- exactly one buffer is designated the current buffer at any time. Most editing
- commands act on the contents of the current buffer. Each buffer, including the
- current buffer, may or may not be displayed in any windows.
-
- Buffers in Emacs editing are objects which have distinct names and hold text
- that can be edited. Buffers appear to Lisp programs as a special data type.
- The contents of a buffer may be viewed as an extendible string; insertions and
- deletions may occur in any part of the buffer. See Text.
-
- A Lisp buffer object contains numerous pieces of information. Some of this
- information is directly accessible to the programmer through variables, while
- other information is only accessible through special-purpose functions. For
- example, the width of a tab character is directly accessible through a
- variable, while the value of point is accessible only through a primitive
- function.
-
- Buffer-specific information that is directly accessible is stored in
- buffer-local variable bindings, which are variable values that are effective
- only in a particular buffer. This feature allows each buffer to override the
- values of certain variables. Most major modes override variables such as
- fill-column or comment-column in this way. For more information about
- buffer-local variables and functions related to them, see Buffer-Local
- Variables.
-
- For functions and variables related to visiting files in buffers, see Visiting
- Files and Saving Buffers. For functions and variables related to the display
- of buffers in windows, see Buffers and Windows.
-
- -- Function: bufferp object
- This function returns t if object is a buffer, nil otherwise.
-
-
- ΓòÉΓòÉΓòÉ 27.2. Buffer Names ΓòÉΓòÉΓòÉ
-
- Each buffer has a unique name, which is a string. The buffer name may be used
- in place of the buffer object in many functions that operate on buffers.
- Buffers that are generally ephemeral and uninteresting to the user have names
- starting with a space, which prevents them from being listed by the
- list-buffers or buffer-menu commands.
-
- Many of the following functions accept either a buffer or a buffer name (a
- string) as an argument. Any argument called buffer-or-name is of this sort,
- and an error is signaled if it is neither a string nor a buffer. Any argument
- called buffer is required to be an actual buffer object, not a name.
-
- -- Function: buffer-name &optional buffer
- This function returns the name of buffer as a string. If buffer is not
- supplied, it defaults to the current buffer.
-
- If buffer-name returns nil, it means that buffer has been killed. See Killing
- Buffers.
-
- (buffer-name)
- => "buffers.texi"
-
- (setq foo (get-buffer "temp"))
- => #<buffer temp>
- (kill-buffer foo)
- => nil
- (buffer-name foo)
- => nil
- foo
- => #<killed buffer>
-
- -- Command: rename-buffer newname
- This function renames the current buffer to newname. An error is signaled if
- newname is not a string, or if there is already a buffer with that name. The
- function returns nil.
-
- One application of this command is to rename the `*shell*' buffer to some
- other name, thus making it possible to create a second shell buffer under the
- name `*shell*'.
-
- -- Function: get-buffer buffer-or-name
- This function returns the buffer specified by buffer-or-name. If
- buffer-or-name is a string and there is no buffer with that name, the value is
- nil. If buffer-or-name is a buffer, it is returned as given. (That is not
- very useful, so the argument is usually a name.) For example:
-
- (setq b (get-buffer "lewis"))
- => #<buffer lewis>
- (get-buffer b)
- => #<buffer lewis>
- (get-buffer "Frazzle-nots")
- => nil
-
-
- ΓòÉΓòÉΓòÉ 27.3. Buffer File Name ΓòÉΓòÉΓòÉ
-
- The buffer file name is the name of the file that is visited in that buffer.
- When a buffer is not visiting a file, its buffer file name is nil. Most of the
- time, the buffer name is the same as the nondirectory part of the buffer file
- name, but the buffer file name and the buffer name are distinct and can be set
- independently. See Visiting Files.
-
- -- Function: buffer-file-name &optional buffer
- This function returns the absolute file name of the file that buffer is
- visiting. If buffer is not visiting any file, buffer-file-name returns nil.
- If buffer is not supplied, it defaults to the current buffer.
-
- (buffer-file-name (other-buffer))
- => "/usr/user/lewis/manual/files.texi"
-
- -- Variable: buffer-file-name
- This buffer-local variable contains the name of the file being visited in the
- current buffer, or nil if it is not visiting a file.
-
- buffer-file-name
- => "/usr/user/lewis/manual/buffers.texi"
-
- It is risky to change this variable's value without doing various other
- things. See the definition of set-visited-file-name in `files.el'; some of the
- things done there, such as changing the buffer name, are not necessary, but
- others are essential to avoid confusing Emacs.
-
- -- Function: get-file-buffer filename
- This function returns the buffer visiting file filename. If there is no such
- buffer, it returns nil. The argument filename, which must be a string, is
- expanded ( see File Name Expansion), then compared against the visited file
- names of all live buffers.
-
- (get-file-buffer "buffers.texi")
- => #<buffer buffers.texi>
-
- In unusual circumstances, there can be more than one buffer visiting the same
- file name. In such cases, this function returns the first such buffer in the
- buffer list.
-
- -- Command: set-visited-file-name filename
- If filename is a non-empty string, this function changes the name of the file
- visited in current buffer to filename. (If the buffer had no visited file,
- this gives it one.) The next time the buffer is saved it will go in the
- newly-specified file. The buffer is always marked as modified, since it does
- not (as far as Emacs knows) match the contents of filename, even if it matched
- the former visited file.
-
- If filename is nil or the empty string, that stands for ``no visited file''.
- In this case, set-visited-file-name marks the buffer as having no visited file.
-
- When set-visited-file-name is called interactively, it prompts for filename in
- the minibuffer.
-
- See also clear-visited-file-modtime and verify-visited-file-modtime in Buffer
- Modification.
-
-
- ΓòÉΓòÉΓòÉ 27.4. Buffer Modification ΓòÉΓòÉΓòÉ
-
- Emacs keeps a flag called the modified flag for each buffer, to record whether
- you have changed the text of the buffer. This flag is set to t whenever you
- alter the contents of the buffer, and cleared to nil when you save it. Thus,
- the flag shows whether there are unsaved changes. The flag value is normally
- shown in the mode line (see Mode Line Variables), and controls saving ( see
- Saving Buffers) and auto-saving (see Auto-Saving).
-
- Some Lisp programs set the flag explicitly. For example, the Lisp function
- set-visited-file-name sets the flag to t, because the text does not match the
- newly-visited file, even if it is unchanged from the file formerly visited.
-
- The functions that modify the contents of buffers are described in Text.
-
- -- Function: buffer-modified-p &optional buffer
- This function returns t if the buffer buffer has been modified since it was
- last read in from a file or saved, or nil otherwise. If buffer is not
- supplied, the current buffer is tested.
-
- -- Function: set-buffer-modified-p flag
- This function marks the current buffer as modified if flag is non-nil, or as
- unmodified if the flag is nil.
-
- Another effect of calling this function is to cause unconditional redisplay of
- the mode line for the current buffer. In fact, the standard way to force
- redisplay of the mode line is as follows:
-
- (set-buffer-modified-p (buffer-modified-p))
-
- -- Command: not-modified
- This command marks the current buffer as unmodified, and not needing to be
- saved. Don't use this function in programs, since it prints a message; use
- set-buffer-modified-p (above) instead.
-
-
- ΓòÉΓòÉΓòÉ 27.5. Comparison of Modification Time ΓòÉΓòÉΓòÉ
-
- Suppose that you visit a file and make changes in its buffer, and meanwhile
- the file itself is changed on disk. At this point, saving the buffer would
- overwrite the changes in the file. Occasionally this may be what you want, but
- usually it would lose valuable information. Emacs therefore checks the file's
- modification time using the functions described below before saving the file.
-
- -- Function: verify-visited-file-modtime buffer
- This function compares Emacs's record of the modification time for the file
- that the buffer is visiting against the actual modification time of the file as
- recorded by the operating system. The two will be the same unless some other
- process has written the file since Emacs visited or saved it.
-
- The function returns t if the last actual modification time and Emacs's
- recorded modification time are the same, nil otherwise.
-
- -- Function: clear-visited-file-modtime
- This function clears out the record of the last modification time of the file
- being visited by the current buffer. As a result, the next attempt to save
- this buffer will not complain of a discrepancy in file modification times.
-
- This function is called in set-visited-file-name and other exceptional places
- where the usual test to avoid overwriting a changed file should not be done.
-
- -- Function: ask-user-about-supersession-threat fn
- This function is used to ask a user how to proceed after an attempt to modify
- an obsolete buffer. An obsolete buffer is an unmodified buffer for which the
- associated file on disk is newer than the last save-time of the buffer. This
- means some other program has probably altered the file.
-
- This function is called automatically by Emacs on the proper occasions. It
- exists so you can customize Emacs by redefining it. See the file `userlock.el'
- for the standard definition.
-
- Depending on the user's answer, the function may return normally, in which
- case the modification of the buffer proceeds, or it may signal a
- file-supersession error with data (fn), in which case the proposed buffer
- modification is not allowed.
-
- See also the file locking mechanism in File Locks.
-
-
- ΓòÉΓòÉΓòÉ 27.6. Read-Only Buffers ΓòÉΓòÉΓòÉ
-
- A buffer may be designated as read-only. This means that the buffer's
- contents may not be modified, although you may change your view of the contents
- by scrolling, narrowing, or widening, etc.
-
- Read-only buffers are used in two kinds of situations:
-
- o A buffer visiting a file is made read-only if the file is write-protected.
-
- Here, the purpose is to show the user that editing the buffer with the aim of
- saving it in the file may be futile or undesirable. The user who wants to
- change the buffer text despite this can do so after clearing the read-only
- flag with the function toggle-read-only.
-
- o Modes such as Dired and Rmail make buffers read-only when altering the
- contents with the usual editing commands is probably a mistake.
-
- The special commands of the mode in question bind buffer-read-only to nil
- (with let) around the places where they change the text.
-
- -- Variable: buffer-read-only
- This buffer-local variable specifies whether the buffer is read-only. The
- buffer is read-only if this variable is non-nil.
-
- -- Command: toggle-read-only
- This command changes whether the current buffer is read-only. It is intended
- for interactive use; don't use it in programs. At any given point in a
- program, you should know whether you want the read-only flag on or off; so you
- can set buffer-read-only explicitly to the proper value, t or nil.
-
- -- Function: barf-if-buffer-read-only
- This function signals a buffer-read-only error if the current buffer is
- read-only. See Interactive Call, for another way to signal an error if the
- current buffer is read-only.
-
-
- ΓòÉΓòÉΓòÉ 27.7. The Buffer List ΓòÉΓòÉΓòÉ
-
- The buffer list is a list of all buffers that have not been killed. The order
- of the buffers in the list is based primarily on how recently each buffer has
- been displayed in the selected window. Several functions, notably
- other-buffer, make use of this ordering.
-
- -- Function: buffer-list
- This function returns a list of all buffers, including those whose names begin
- with a space. The elements are actual buffers, not their names.
-
- (buffer-list)
- => (#<buffer buffers.texi> #<buffer *Minibuf-1*>
- #<buffer buffer.c> #<buffer *Help*> #<buffer TAGS>)
-
- ;; Note that the name of the minibuffer begins with a space!
-
- (mapcar (function buffer-name) (buffer-list))
- => ("buffers.texi" " *Minibuf-1*" "buffer.c" "*Help*" "TAGS")
-
- This list is a copy of a list used inside Emacs; modifying it has no effect on
- the buffers.
-
- -- Function: other-buffer &optional buffer-or-name
- This function returns the first buffer in the buffer list other than
- buffer-or-name. Usually this is the buffer most recently shown in the selected
- window, aside from buffer-or-name. Buffers are moved to the front of the list
- when they are selected and to the end when they are buried. Buffers whose
- names start with a space are not even considered.
-
- If buffer-or-name is not supplied (or if it is not a buffer), then
- other-buffer returns the first buffer on the buffer list that is not visible in
- any window.
-
- If no suitable buffer exists, the buffer `*scratch*' is returned (and created,
- if necessary).
-
- -- Command: list-buffers &optional files-only
- This function displays a listing of the names of existing buffers. It clears
- the buffer `*Buffer List*', then inserts the listing into that buffer and
- displays it in a window. list-buffers is intended for interactive use, and is
- described fully in The GNU Emacs Manual. It returns nil.
-
- -- Command: bury-buffer &optional buffer-or-name
- This function puts buffer-or-name at the end of the buffer list without
- changing the order of any of the other buffers on the list. This buffer
- therefore becomes the least desirable candidate for other-buffer to return, and
- appears last in the list displayed by list-buffers.
-
- If buffer-or-name is the current buffer, then it is replaced in the selected
- window by the buffer chosen using other-buffer. If the buffer is displayed in
- a window other than the selected one, it remains there.
-
- If buffer-or-name is not supplied, it defaults to the current buffer. This is
- what happens in an interactive call.
-
-
- ΓòÉΓòÉΓòÉ 27.8. Creating Buffers ΓòÉΓòÉΓòÉ
-
- This section describes the two primitives for creating buffers.
- get-buffer-create creates 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 to create buffers are with-output-to-temp-buffer (see
- Temporary Displays) and create-file-buffer (see 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.
-
- An error is signaled if name is not a string.
-
- (get-buffer-create "foo")
- => #<buffer foo>
-
- The major mode for the new buffer is chosen according to the value of
- default-major-mode. See Auto Major Mode.
-
- -- 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 added to name, where n stands
- for successive integers starting with 2. New suffixes are tried until an
- unused name is found.
-
- An error is signaled 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>>
-
- The major mode for the new buffer is chosen according to the value of
- default-major-mode. See Auto Major Mode.
-
-
- ΓòÉΓòÉΓòÉ 27.9. Killing Buffers ΓòÉΓòÉΓòÉ
-
- Killing a buffer makes its name unknown to Emacs and makes its space available
- for other use.
-
- The buffer object for the buffer which has been killed remains in existence as
- long as anything refers to it, but it is specially marked so that you cannot
- make it current or display it. Killed buffers retain their identity, however;
- two distinct buffers, when killed, remain distinct according to eq.
-
- The buffer-name of a killed buffer is nil. You can use this feature to test
- whether a buffer has been killed:
-
- (defun killed-buffer-p (buffer)
- "Return t if BUFFER is killed."
- (not (buffer-name buffer)))
-
- -- Command: kill-buffer buffer-or-name
- This function kills the buffer buffer-or-name, freeing all its memory for use
- as space for other buffers. (In Emacs version 18, the memory is not returned
- to the operating system.) It returns nil.
-
- Any processes that have this buffer as the process-buffer are sent the SIGHUP
- signal, which normally causes them to terminate. (The usual meaning of SIGHUP
- is that a dialup line has been disconnected.) See Deleting Processes.
-
- 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 to confirm before
- the buffer is killed. This is done even if kill-buffer is not called
- interactively. To prevent the request for confirmation, clear the modified
- flag before calling kill-buffer. See Buffer Modification.
-
- (kill-buffer "foo.unchanged")
- => nil
- (kill-buffer "foo.changed")
-
- ---------- Buffer: Minibuffer ----------
- Buffer foo.changed modified; kill anyway? (yes or no) yes
- ---------- Buffer: Minibuffer ----------
-
- => nil
-
-
- ΓòÉΓòÉΓòÉ 27.10. The Current Buffer ΓòÉΓòÉΓòÉ
-
- There are in general many buffers in an Emacs session. At any time, one of
- them is designated as the current buffer. This is the buffer in which most
- editing takes place, because most of the primitives for examining or changing
- text in a buffer operate implicitly on the current buffer (see Text). Normally
- the buffer that is displayed on the screen in the selected window is the
- current buffer, but this is not always so: a Lisp program can designate any
- buffer as current temporarily in order to operate on its contents, without
- changing what is displayed on the screen.
-
- The way to designate a current buffer in a Lisp program is by calling
- set-buffer. The specified buffer remains current until a new one is
- designated.
-
- When an editing command returns to the editor command loop, the command loop
- designates the buffer displayed in the selected window as current, to prevent
- confusion: the buffer that the cursor is in, when Emacs reads a command, is the
- one to which the command will apply. (See Command Loop.) Therefore, set-buffer
- is not usable for switching visibly to a different buffer so that the user can
- edit it. For this, you must use the functions described in Displaying Buffers.
-
- However, Lisp functions that change to a different current buffer should not
- rely on the command loop to set it back afterwards. Editing commands written
- in Emacs Lisp can be called from other programs as well as from the command
- loop. It is convenient for the caller if the subroutine does not change which
- buffer is current (unless, of course, that is the subroutine's purpose).
- Therefore, you should normally use set-buffer within a save-excursion that will
- restore the current buffer when your program is done (see Excursions). 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 records the values of point, the mark, and the original buffer.
- Next, set-buffer makes another buffer current. Finally, insert-buffer-substring
- copies the string from the original current buffer to the new current buffer.
-
- If the buffer appended to happens to be displayed in some window, then the
- next redisplay will show how its text has changed. Otherwise, you will not see
- the change immediately on the screen. The buffer becomes current temporarily
- during the execution of the command, but this does not cause it to be
- displayed.
-
- -- Function: current-buffer
- This function returns the current buffer.
-
- (current-buffer)
- => #<buffer buffers.texi>
-
- -- Function: set-buffer buffer-or-name
- This function makes buffer-or-name the current buffer. 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 in any case work on it.
-
- This function returns the buffer identified by buffer-or-name. An error is
- signaled if buffer-or-name does not identify an existing buffer.
-
-
- ΓòÉΓòÉΓòÉ 28. Windows ΓòÉΓòÉΓòÉ
-
- This chapter describes most of the functions and variables related to Emacs
- windows. See Emacs Display, for information on how text is displayed in
- windows.
-
-
- ΓòÉΓòÉΓòÉ 28.1. Basic Concepts of Emacs Windows ΓòÉΓòÉΓòÉ
-
- A window is the physical area of the screen in which a buffer is displayed.
- The term is also used to refer to a Lisp object which represents that screen
- area in Emacs Lisp. It should be clear from the context which is meant.
-
- There is always 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 when set-buffer has been used.) See Current Buffer.
-
- For all intents, a window only exists while 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. (See Deleting Windows.)
-
- Each window has the following attributes:
-
- o window height
-
- o window width
-
- o window edges with respect to the screen
-
- o the buffer it displays
-
- o position within the buffer at the upper left of the window
-
- o the amount of horizontal scrolling, in columns
-
- o point
-
- o the mark
-
- o how recently the window was selected
-
- Applications use multiple windows for a variety of reasons, but most often to
- give different views of the same information. In Rmail, for example, you can
- move through a summary buffer in one window while the other window shows
- messages one at a time as they are reached.
-
- 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 on 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 Windows. In this manual, the term
- ``window'' refers to the nonoverlapping subdivisions of the Emacs display. If
- Emacs is displaying on a window system, the Emacs display may itself be one X
- window among many on the screen. But Emacs version 18 knows nothing of this.
-
- 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, except (sometimes) the minibuffer area. This limitation helps
- avoid wasting the historically scarce resource of screen space. It also works
- 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. See Splitting Windows. Also, see Size of Window.
-
- See Emacs Display, for information on how the contents of the window's buffer
- are displayed in the window.
-
- -- Function: windowp object
- This function returns t if object is a window.
-
-
- ΓòÉΓòÉΓòÉ 28.2. Splitting Windows ΓòÉΓòÉΓòÉ
-
- The functions described here are the primitives used to split a window into
- two windows. Two higher level functions sometimes split a window, but not
- always: pop-to-buffer and display-buffer (see Displaying Buffers).
-
- The functions described here do not accept a buffer as an argument. They let
- the two ``halves'' of the split window display the same buffer previously
- visible in the window that was split.
-
- -- Function: one-window-p &optional no-mini
- This function returns non-nil if there is only one window. The argument
- no-mini, if non-nil, means don't count the minibuffer even if it is active;
- otherwise, the minibuffer window is included, if active, in the total number of
- windows which is compared against one.
-
- -- Command: split-window &optional window size horizontal
- This function splits window into two windows. The original window window
- remains the selected window, but occupies only part of its former screen area.
- The rest is occupied by a newly created window which is returned as the value
- of this function.
-
- If horizontal is non-nil, then window splits side by side, keeping the
- leftmost size columns and giving the rest of the columns to the new window.
- Otherwise, it splits into halves one above the other, keeping the upper size
- lines and giving the rest of the lines to the new window. The original window
- is therefore the right-hand or upper of the two, and the new window is the
- left-hand or lower.
-
- If window is omitted or nil, then the selected window is split. If size is
- omitted or nil, 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, all its arguments are 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.
-
- (setq w (selected-window))
- => #<window 8 on windows.texi>
- (window-edges) ; Edges in order: left--top--right--bottom
- => (0 0 80 50)
-
- (setq w2 (split-window w 15)) ; Returns window created
- => #<window 28 on windows.texi>
- (window-edges w2)
- => (0 15 80 50) ; 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 50
- column 0 column 80
-
- Next, the top window is split horizontally:
-
- (setq w3 (split-window w 35 t))
- => #<window 32 on windows.texi>
- (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 50) ; Bottom window unchanged
-
- Now, the screen looks like this:
-
- column 35
- __________
- | | | line 0
- | w | w3 |
- |___|______|
- | | line 15
- | w2 |
- |__________|
- line 50
- column 0 column 80
-
- -- Command: split-window-vertically size
- This function splits the selected window into two windows, 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..."
- (interactive "P")
- (split-window nil (and arg (prefix-numeric-value arg))))
-
- -- Command: split-window-horizontally size
- This function splits the selected window into two windows side-by-side,
- leaving the selected window with size columns.
-
- This function is simply an interface to split-windows. Here is the complete
- definition for split-window-horizontally (except for part of the documentation
- string):
-
- (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))
-
-
- ΓòÉΓòÉΓòÉ 28.3. Deleting Windows ΓòÉΓòÉΓòÉ
-
- A deleted window no longer appears on the screen. In Emacs version 18, the
- space it took up on the screen 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. An error is signaled if there is only one window
- when delete-window is called.
-
- *Warning:* erroneous information or fatal errors may result from using a
- deleted window. Use (window-point window) to test whether a window has been
- deleted; it yields nil for a deleted window.
-
- This function returns nil.
-
- When delete-window is called interactively, window defaults to the selected
- window.
-
- -- Command: delete-other-windows &optional window
- This function makes window the only window on the screen by deleting all the
- other windows. If window is omitted or nil, then the selected window is used
- by default.
-
- 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.
- See The Buffer List.
-
- 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.
-
-
- ΓòÉΓòÉΓòÉ 28.4. Selecting Windows ΓòÉΓòÉΓòÉ
-
- When a window is selected, the buffer in the window becomes the current
- buffer, and 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 buffer being displayed in window is immediately
- designated the current buffer.
-
- The return value is window.
-
- (setq w (next-window))
- (select-window w)
- => #<window 65 on windows.texi>
-
- The following functions choose one of the windows on the screen, offering
- various criteria for the choice.
-
- -- Function: get-lru-window
- This function returns the window least recently ``used'' (that is, selected).
- The selected window is always 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 not considered a candidate.
-
- -- Function: get-largest-window
- This function returns the window with the largest area (height times width).
- If there are no side-by-side windows, then this is the window with the most
- lines. The minibuffer window is not considered a candidate.
-
- If there are two windows of the same size, then the function returns the
- window which is first in the cyclic ordering of windows (see following
- section), starting from the selected window.
-
-
- ΓòÉΓòÉΓòÉ 28.5. Cycling Ordering of Windows ΓòÉΓòÉΓòÉ
-
- When you use the command C-x o (other-window) to select the next window, it
- moves through all the windows on the screen in a specific cyclic order. For
- any given configuration of windows, this order never varies. It is called the
- cyclic ordering of windows.
-
- This ordering generally goes from top to bottom, and from left to right. But
- it may go down first or go right first, depending on the order in which the
- screen, or the windows within the screen, were split.
-
- If the screen was first split vertically (into windows one above each other),
- and then the subwindows were 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 was first split horizontally, the ordering is top to
- bottom in the left part, and so on. In general, within each set of siblings at
- any level in the window tree, the order is left to right, or top to bottom.
-
- -- Function: next-window window &optional minibuf
- This function returns the window following window in the cyclic ordering of
- windows. This is the window which C-x o would select if done when window is
- selected. If window is the only window visible, then this function returns
- window.
-
- The value of the argument minibuf determines whether the minibuffer is included
- in the window order. Normally, when minibuf is nil, the minibuffer is included
- if it is currently active; this is the behavior of C-x o.
-
- If minibuf is t, then the cyclic 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. (The minibuffer window is active
- while the minibuffer is in use. See Minibuffers.)
-
- This example shows two windows, which both happen to be displaying the same
- buffer:
-
- (selected-window)
- => #<window 56 on windows.texi>
- (next-window (selected-window))
- => #<window 52 on windows.texi>
- (next-window (next-window (selected-window)))
- => #<window 56 on windows.texi>
-
- -- Function: previous-window window
- This function returns the window preceding window in the cyclic ordering of
- windows.
-
- -- Command: other-window count
- This function selects the countth next window in the cyclic order. If count
- is negative, then it selects the -countth preceding window. It returns nil.
-
- In an interactive call, count is the numeric prefix argument.
-
-
- ΓòÉΓòÉΓòÉ 28.6. Buffers and Windows ΓòÉΓòÉΓòÉ
-
- This section describes low-level functions to examine windows or to show
- buffers in windows in a precisely controlled fashion. See Displaying 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 these, but they employ
- heuristics in choosing or creating a window; use these functions 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
- nil.
-
- (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.texi>
-
- -- 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 first one in the cyclic ordering of windows, starting from the selected
- window. See Cyclic Window Ordering.
-
- -- Command: replace-buffer-in-windows buffer
- This function replaces buffer with some other buffer in all windows displaying
- it. The other buffer used is chosen with other-buffer. In the usual
- applications of this function, you don't care which other buffer is used; you
- just want to make sure that buffer is off the screen.
-
- This function returns nil.
-
-
- ΓòÉΓòÉΓòÉ 28.7. Displaying Buffers in Windows ΓòÉΓòÉΓòÉ
-
- In this section we describe convenient functions that choose a window
- automatically and use it to display a specified buffer. These functions can
- also split an existing window in certain circumstances. We also describe
- variables that parameterize the heuristics used for choosing a window. See
- Buffers and Windows, for low-level functions that give you more precise
- control.
-
- Do not use the functions in this section in order to make a buffer current so
- that a Lisp program can access or modify it; they are too drastic for that
- purpose, since they change the display of buffers on the screen, which is
- gratuitous and will surprise the user. Instead, use set-buffer (see Current
- Buffer) and save-excursion (see Excursions), which designate buffers as current
- for programmed access without affecting the display of buffers in windows.
-
- -- Command: switch-to-buffer buffer-or-name &optional norecord
- This function makes buffer-or-name the current buffer, and also displays the
- buffer in the selected window. This means that a human can see the buffer and
- subsequent keyboard commands will apply to it. Contrast this with set-buffer,
- which makes buffer-or-name the current buffer but does not display it in the
- selected window. See Current Buffer.
-
- If buffer-or-name does not identify an existing buffer, then a new buffer by
- that name is created.
-
- Normally the specified buffer is put at the front of the buffer list. This
- affects the operation of other-buffer. However, if norecord is non-nil, this
- is not done. See 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. It always returns nil.
-
- -- Command: switch-to-buffer-other-window buffer-or-name
- This function makes buffer-or-name the current buffer and displays it in a
- window not currently selected. It then selects that window. The handling of
- the buffer is the same as in switch-to-buffer.
-
- The previously selected window is absolutely never used to display the buffer.
- If it is the only window, then it is split to make a distinct window for this
- purpose. If the selected window is already displaying the buffer, then it
- continues to do so, but another window is nonetheless found to display it in as
- well.
-
- -- Function: pop-to-buffer buffer-or-name &optional other-window
- This function makes buffer-or-name the current buffer and switches to it in
- some window, preferably not the window previously selected. The ``popped-to''
- window becomes the selected window.
-
- 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.
-
- 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 end up displayed in two windows. On the other hand, if
- buffer-or-name is already displayed in the selected window and other-window is
- nil, then the selected window is considered sufficient display for
- buffer-or-name, so that nothing needs to be done.
-
- If buffer-or-name is a string that does not name an existing buffer, a buffer
- by that name is created.
-
- An example use of this function is found at the end of Filter Functions.
-
- -- 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
- identity of the selected window is unaltered by this function.
-
- If not-this-window is non-nil, it means that the specified buffer should be
- displayed in a window other than the selected one, even if it is already on
- display in the selected window. This can cause the buffer to appear in two
- windows at once. Otherwise, if buffer-or-name is already being displayed 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.
-
- display-buffer returns the window chosen to display buffer-or-name.
-
- -- User Option: pop-up-windows
- This variable controls whether display-buffer makes new windows. If it is
- non-nil 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.
-
- This variable also affects pop-to-buffer, which uses display-buffer as a
- subroutine.
-
- -- User Option: split-height-threshold
- This variable determines when display-buffer may split a window, if 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 is split regardless of this value, provided
- pop-up-windows is non-nil.
-
-
- ΓòÉΓòÉΓòÉ 28.8. Window Point ΓòÉΓòÉΓòÉ
-
- Each window has its own value of point, independent of the value of point in
- other windows displaying the same buffer. This makes it useful to have
- multiple windows showing one buffer.
-
- o The window point is established when a window is first created; it is
- initialized from the buffer's point, or from the window point of another
- window opened on the buffer if such a window exists.
-
- o Selecting a window sets the value of point in its buffer to the window's
- value of point. Conversely, deselecting a window copies the buffer's value
- of point into the window. Thus, when you switch between windows that display
- a given buffer, the point value for the selected window is in effect in the
- buffer, while the point values for the other windows are stored in those
- windows.
-
- o As long as the selected window displays the current buffer, the window's
- point and the buffer's point always move together; they remain equal.
-
- o See 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 point in window. For a
- nonselected window, this is the value point would have (in that window's
- buffer) if that window were selected.
-
- When window is the selected window and its buffer is also the current buffer,
- the value returned is the same as point in that buffer.
-
- Strictly speaking, it would be more correct to return the ``top-level'' value
- of point, outside of any save-excursion forms. But that value is hard to find.
-
- -- Function: set-window-point window position
- This function positions point in window at position position in window's
- buffer.
-
-
- ΓòÉΓòÉΓòÉ 28.9. The Display-Start Position ΓòÉΓòÉΓòÉ
-
- Each window contains a marker used to keep track of a buffer position which
- specifies where in the buffer display should start. This position is called
- the display-start position of the window. The character after this position is
- the one that appears at the upper left corner of the window. It is usually,
- but not inevitably, at the beginning of a text line.
-
- -- Function: window-start &optional window
- This function returns the display-start position of window window. If window
- is nil, the selected window is used.
-
- (window-start)
- => 7058
-
- For a more complicated example of use, see the description of count-lines in
- Text Lines.
-
- -- Function: set-window-start window position &optional noforce
- This function sets the display-start position of window to position in
- window's buffer.
-
- The display routines insist that the position of point be visible when a
- buffer is displayed. Normally, they change the display-start position (that
- is, scroll the window) whenever necessary to make point visible. However, if
- you specify the start position with this function with nil for noforce, it
- means you want display to start at position even if that would put the location
- of point off the screen. What the display routines do in this case is move
- point instead, to the left margin on the middle line in the window.
-
- For example, if point is 1 and you attempt to set the start of the window to
- 2, then the position of point would be ``above'' the top of the window. The
- display routines would automatically move point if it is still 1 when redisplay
- occurs. Here is an example:
-
- ;; 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, set-window-start does nothing if the
- specified start position would make point invisible.
-
- This function returns position, 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 within the range of text currently
- visible on the screen in window. It returns nil if position is scrolled
- vertically out of view. The argument position defaults to the current position
- of point; window, to the selected window. Here is an example:
-
- (or (pos-visible-in-window-p (point) (selected-window))
- (recenter 0))
-
- The pos-visible-in-window-p function considers only vertical scrolling. It
- returns t if position is out of view only because window has been scrolled
- horizontally. See Horizontal Scrolling.
-
-
- ΓòÉΓòÉΓòÉ 28.10. Vertical Scrolling ΓòÉΓòÉΓòÉ
-
- Vertical scrolling means moving the text up or down in a window. It works by
- changing the value of the window's display-start location. It may also 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. 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 urged that the opposite convention be used: they imagine that
- the window moves over text that remains in place. Then ``down'' commands would
- take you to the end of the buffer. This view is more consistent with the
- actual relationship between windows and the text in the buffer, but it is less
- like what the user sees. The position of a window on the terminal does not
- move, and short scrolling commands clearly move the text up or down on the
- screen. We have chosen names that fit the user's point of view.
-
- The scrolling functions (aside from scroll-other-window) will have
- unpredictable results if the current buffer is different from the buffer that
- is displayed in the selected window. See Current Buffer.
-
- -- Command: scroll-up &optional count
- This function scrolls the text in the selected window upward count lines. If
- count is negative, scrolling is actually downward.
-
- If count is nil (or omitted), then the length of the scroll is
- next-screen-context-lines lines less than the usable height of the window (not
- counting its mode line).
-
- scroll-up returns nil.
-
- -- Command: scroll-down &optional count
- This function scrolls the text in the selected window downward count lines.
- If count is negative, scrolling is actually upward.
-
- If count is omitted or nil, then the length of the scroll is
- next-screen-context-lines lines less than the usable height of the window.
-
- scroll-down returns nil.
-
- -- Command: scroll-other-window &optional count
- This function scrolls the text in another window upward count lines. Negative
- values of count, or nil, are handled as in scroll-up.
-
- The window that is scrolled is normally the one following the selected window
- in the cyclic ordering of windows---the window that next-window would return.
- See Cyclic Window Ordering.
-
- If the selected window is the minibuffer, the next window is normally the one
- at the top left corner. However, you can specify the window to scroll by
- binding the variable minibuffer-scroll-window. This variable has no effect
- when any other window is selected. See Minibuffer Misc.
-
- When the minibuffer is active, it is the next window if the selected window is
- the one at the bottom right corner. In this case, scroll-other-window will
- attempt to scroll the minibuffer. If the minibuffer contains just one line,
- that line will be redisplayed after the echo area momentarily displays the
- message ``Beginning of buffer''.
-
- -- User Option: scroll-step
- This variable controls how scrolling is done automatically when point moves off
- the screen. If the value is zero, then the text is scrolled so that point is
- centered vertically in the window. If the value is a positive integer n, then
- if it is possible to bring point back on screen by scrolling n lines in either
- direction, that is done; otherwise, point is centered vertically as usual. The
- default value is zero.
-
- -- User Option: next-screen-context-lines
- The value of this variable is the number of lines of continuity to retain when
- scrolling by full screens. For example, when scroll-up executes, this many
- lines that were visible at the bottom of the window move to the top of the
- window. The default value is 2.
-
- -- Command: recenter &optional count
- This function scrolls the selected window to put the text where point is
- located at a specified screen position.
-
- If count is a nonnegative number, it puts the line containing point count
- lines down from the top of the window. If count is a negative number, then it
- counts upward from the bottom of the window, so that -1 stands for the last
- usable line in the window. If count is a non-nil list, then it stands for the
- line in the middle of the window.
-
- If count is nil, then it puts the line containing point in the middle of the
- window, then clears and redisplays the entire screen.
-
- When recenter is called interactively, Emacs sets count to the raw prefix
- argument. Thus, typing C-u as the prefix sets the count to a non-nil list,
- while typing C-u 4 sets count to 4, which positions the current line four lines
- from the top.
-
- Typing C-u 0 C-l positions the current line at the top of the window. This
- action is so handy that some people bind the command to a function key. For
- example,
-
- (defun line-to-top-of-window ()
- "Scroll the selected window up so current line moves to the top.
- Replaces three keystroke sequence C-u 0 C-l."
- (interactive)
- (recenter 0))
-
- (global-set-key "\C-cl" 'line-to-top-of-window)
-
-
- ΓòÉΓòÉΓòÉ 28.11. Horizontal Scrolling ΓòÉΓòÉΓòÉ
-
- Because we read English first from top to bottom and second from left to
- right, horizontal scrolling is not like vertical scrolling. Vertical scrolling
- involves selection of a contiguous portion of text to display. Horizontal
- scrolling causes part of each line to go off screen. The amount of horizontal
- scrolling is therefore specified as a number of columns rather than as a
- position in the buffer. It has nothing to do with the display-start position
- returned by window-start.
-
- Usually, no horizontal scrolling is in effect; then the leftmost column is at
- the left edge of the window. In this state, scrolling to the right is
- meaningless, since there is no data to the left of the screen to be revealed by
- it, so it is not allowed. Scrolling to the left is allowed; it causes the
- first columns of text to go off the edge of the window and can reveal
- additional columns on the right that were truncated before. Once a window has
- a nonzero amount of leftward horizontal scrolling, you can scroll it back to
- the right, but only so far as to reduce the net horizontal scroll to zero.
- There is no limit to how far left you can scroll, but eventually all the text
- will disappear off the left edge.
-
- -- Command: scroll-left count
- This function scrolls the selected window count columns to the left (or to the
- right if count is negative). The return value is the total amount of leftward
- horizontal scrolling in effect after the change---just like the value returned
- by window-hscroll.
-
- -- Command: scroll-right count
- This function scrolls the selected window count columns to the right (or to
- the left if count is negative). The return value is the total amount of
- leftward horizontal scrolling in effect after the change---just like the value
- returned by window-hscroll.
-
- Once you scroll a window as far right as it can go, back to its normal
- position where the total leftward scrolling is zero, attempts to scroll any
- farther have no effect.
-
- -- Function: window-hscroll &optional window
- This function returns the total leftward horizontal scrolling of window---the
- number of columns by which the text in window is scrolled left past the left
- margin.
-
- The value is never negative. It is zero when no horizontal scrolling has been
- done in window (which is usually the case).
-
- If window is nil, the selected window is used.
-
- (window-hscroll)
- => 0
- (scroll-left 5)
- => 5
- (window-hscroll)
- => 5
-
- -- 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. The argument columns should be zero or
- positive; if not, it is taken as zero.
-
- The value returned is columns.
-
- (set-window-hscroll (selected-window) 10)
- => 10
-
- Here is how you can determine whether a given position position is off the
- screen due to horizontal scrolling:
-
- (save-excursion
- (goto-char position)
- (and
- (>= (- (current-column) (window-hscroll window)) 0)
- (< (- (current-column) (window-hscroll window))
- (window-width window))))
-
-
- ΓòÉΓòÉΓòÉ 28.12. The Size of a Window ΓòÉΓòÉΓòÉ
-
- An Emacs window is rectangular, and its size information consists of the
- height (the number of lines) and the width (the number of character positions
- in each line). The mode line is included in the height. For a window that
- does not abut the right hand edge of the screen, the column of `|' characters
- that separates it from the window on the right is included in the width.
-
- 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 the value of
- (screen-height) (since the last line is always reserved for the minibuffer).
-
- If window is nil, the function uses the selected window.
-
- (window-height)
- => 23
- (split-window-vertically)
- => #<window 4 on windows.texi>
- (window-height)
- => 11
-
- -- Function: window-width &optional window
- This function returns the number of columns in window. If window fills the
- entire screen, this is the same as the value of (screen-width).
-
- 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. If window is
- nil, the selected window is used.
-
- The order of the list is (left top right bottom), all elements relative to 0,
- 0 at the top left corner of the screen. The element right of the value 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.
-
- Here is the result obtained on a typical 24-line terminal with just one
- window:
-
- (window-edges (selected-window))
- => (0 0 80 23)
-
- If window is at the upper left corner of the screen, right and bottom are the
- same as the values returned by (window-width) and (window-height) respectively,
- and top and bottom are zero. For example, the edges of the following window
- are `0 0 5 8'. Assuming that the screen has more than 8 columns, the last
- column of the window (column 7) holds a border rather than text. The last row
- (row 4) holds the mode line, shown here with `xxxxxxxxx'.
-
- 0
- _______
- 0 | |
- | |
- | |
- | |
- xxxxxxxxx 4
-
- 7
-
- When there are side-by-side windows, any window not at the right edge of the
- screen has a border in its last column. This border counts as one column in
- the width of the window. A window never includes a border on its left, since
- the border there belongs to the window to the left.
-
- In the following example, let's imagine that the screen is 7 columns wide.
- Then the edges of the left window are `0 0 4 3' and the edges of the right
- window are `4 0 7 3'.
-
- ___ ___
- | | |
- | | |
- xxxxxxxxx
-
- 0 34 7
-
-
- ΓòÉΓòÉΓòÉ 28.13. Changing the Size of a Window ΓòÉΓòÉΓòÉ
-
- The window size functions fall 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 between windows, so resizing
- one window affects other windows.
-
- -- 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 the window by -size lines. If it
- becomes shorter than window-min-height, it disappears.
-
- enlarge-window returns nil.
-
- -- Command: enlarge-window-horizontally columns
- This function makes the selected window columns wider. It could be defined as
- follows:
-
- (defun enlarge-window-horizontally (columns)
- (enlarge-window columns t))
-
- -- Command: shrink-window size &optional horizontal
- This function is like enlarge-window but negates the argument size, making the
- selected window smaller by giving lines (or columns) to the other windows. If
- the window shrinks below window-min-height or window-min-width, then it
- disappears.
-
- If size is negative, the window is enlarged by -size lines.
-
- -- Command: shrink-window-horizontally columns
- This function makes the selected window columns narrower. It could be defined
- as follows:
-
- (defun shrink-window-horizontally (columns)
- (shrink-window columns t))
-
- The following two variables constrain the window size changing 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. A window disappears when it becomes smaller than
- window-min-height, and no window may be created that is smaller. The absolute
- minimum height is two (allowing one line for the mode line, and one line for
- the buffer display). Actions which change window sizes reset this variable to
- two if it is less than two. The default value is 4.
-
- -- User Option: window-min-width
- The value of this variable determines how narrow a window may become before it
- disappears. A window disappears when it becomes narrower than
- window-min-width, and no window may be created that is narrower. The absolute
- minimum width is one; any value below that is ignored. The default value is
- 10.
-
-
- ΓòÉΓòÉΓòÉ 28.14. 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 the mark. You can bring back an entire previous screen
- layout by restoring a window configuration that you had previously saved.
-
- -- Function: current-window-configuration
- This function returns a new object representing Emacs's current window
- configuration, namely the number of windows, their sizes and current buffers,
- which window is the selected window, and for each window the displayed buffer,
- the display-start position, and the positions of point and the mark. An
- exception is made for point in the current buffer, whose value is not saved.
-
- -- Function: set-window-configuration configuration
- This function restores the configuration of Emacs's windows and buffers to the
- state specified by configuration. The argument configuration must be a value
- that was previously returned by current-window-configuration.
-
- Here is a way of using this function to get the same effect as
- save-window-excursion:
-
- (let ((config (current-window-configuration)))
- (unwind-protect
- (progn (split-window-vertically nil)
- ...)
- (set-window-configuration config)))
-
- -- Special Form: save-window-excursion forms...
- This special form executes forms in sequence, preserving window sizes and
- contents, including the value of point and the portion of the buffer which is
- visible. However, it does not restore the value of point in the current
- buffer; use save-excursion for that.
-
- The return value is the value of the final form in forms. For example:
-
- (split-window)
- => #<window 25 on control.texi>
- (setq w (selected-window))
- => #<window 19 on control.texi>
- (save-window-excursion
- (delete-other-windows w)
- (switch-to-buffer "foo")
- 'do-something)
- => do-something
- ;; The screen is now split again.
-
- Primitives to look inside of window configurations would make sense, but none
- are implemented. It is not clear they are useful enough to be worth
- implementing.
-
-
- ΓòÉΓòÉΓòÉ 29. Positions ΓòÉΓòÉΓòÉ
-
- A position is the index of a character in the text of buffer. More precisely,
- a position identifies the place between two characters (or before the first
- character, or after the last character), so we can speak of the character
- before or after a given position. However, the character after a position is
- often said to be ``at'' that position.
-
- Positions are usually represented as integers starting from 1, but can also be
- represented as markers---special objects which relocate automatically when text
- is inserted or deleted so they stay with the surrounding characters. See
- Markers.
-
-
- ΓòÉΓòÉΓòÉ 29.1. 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 to allow editing and insertion at
- different places.
-
- Like other positions, point designates a place between two characters (or
- before the first character, or after the last character), rather than a
- particular character. Many terminals display the cursor over the character
- that immediately follows point; on such terminals, point is actually before the
- character on which the cursor sits.
-
- The value of point is a number between 1 and the buffer size plus 1. If
- narrowing is in effect (see Narrowing), then point is constrained to fall
- within the accessible portion of the buffer (possibly at one end of it).
-
- Each buffer has its own value of point, which is independent of the value of
- point in other buffers. 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 have different values in various windows that display the same
- 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. See Window Point, for more details.
-
- -- Function: point
- This function returns the position of point in the current buffer, as an
- integer.
-
- (point)
- => 175
-
- -- Function: point-min
- This function returns the minimum accessible value of point in the current
- buffer. This is 1, unless narrowing is in effect, in which case it is the
- position of the start of the region that you narrowed to. (See Narrowing.)
-
- -- Function: point-max
- This function returns the maximum accessible value of point in the current
- buffer. This is (1+ (buffer-size)), unless narrowing is in effect, in which
- case it is the position of the end of the region that you narrowed to. (See
- Narrowing).
-
- -- Function: buffer-end flag
- This function returns (point-min) if flag is less than 1, (point-max)
- otherwise. The argument flag must be a number.
-
- -- Function: buffer-size
- This function returns the total number of characters in the current buffer.
- In the absence of any narrowing (see Narrowing), point-max returns a value one
- larger than this.
-
- (buffer-size)
- => 35
- (point-max)
- => 36
-
- -- Variable: buffer-saved-size
- The value of this buffer-local variable is the former length of the current
- buffer, as of the last time it was read in, saved or auto-saved.
-
-
- ΓòÉΓòÉΓòÉ 29.2. Motion ΓòÉΓòÉΓòÉ
-
- Motion functions change the value of point, either relative to the current
- value of point, relative to the beginning or end of the buffer, or relative to
- the edges of the selected window.
-
-
- ΓòÉΓòÉΓòÉ 29.2.1. Motion by Characters ΓòÉΓòÉΓòÉ
-
- These functions move point based on a count of characters. goto-char is a
- fundamental primitive because it is the way to move point to a specified
- position.
-
- -- Command: goto-char position
- This function sets point in the current buffer to the value position. If
- position is less than 1, then point is set to the beginning of the buffer. If
- it is greater than the length of the buffer, then point is set to the end of
- the buffer.
-
- If narrowing is in effect, then the position is still measured from the
- beginning of the buffer, but point cannot be moved outside of the accessible
- portion. Therefore, if position is too small, point is set to the beginning of
- the accessible portion of the text; if position is too large, point is set to
- the end.
-
- When this function is called interactively, position is the numeric prefix
- argument, if provided; otherwise it is read from the minibuffer.
-
- goto-char returns position.
-
- -- Command: forward-char &optional count
- This function moves point forward, towards the end of the buffer, count
- characters (or backward, towards the beginning of the buffer, if count is
- negative). If the function attempts to move point past the beginning or end of
- the buffer (or the limits of the accessible portion, when narrowing is in
- effect), an error is signaled with error code beginning-of-buffer or
- end-of-buffer.
-
- In an interactive call, count is the numeric prefix argument.
-
- -- Command: backward-char &optional count
- This function moves point backward, towards the beginning of the buffer, count
- characters (or forward, towards the end of the buffer, if count is negative).
- If the function attempts to move point past the beginning or end of the buffer
- (or the limits of the accessible portion, when narrowing is in effect), an
- error is signaled with error code beginning-of-buffer or end-of-buffer.
-
- In an interactive call, count is the numeric prefix argument.
-
-
- ΓòÉΓòÉΓòÉ 29.2.2. Motion by Words ΓòÉΓòÉΓòÉ
-
- These functions for parsing words use the syntax table to decide whether a
- given character is part of a word. See Syntax Tables.
-
- -- Command: forward-word count
- This function moves point forward count words (or backward if count is
- negative). Normally it returns t. If this motion encounters the beginning or
- end of the buffer, or the limits of the accessible portion when narrowing is in
- effect, point stops there and the value is nil.
-
- In an interactive call, count is set to the numeric prefix argument.
-
- -- Command: backward-word count
- This function just like forward-word, except that it moves backward until
- encountering the front of a word, rather than forward.
-
- In an interactive call, count is set to the numeric prefix argument.
-
- This function is rarely used in programs, as it is more efficient to call
- forward-word with negative argument.
-
-
- ΓòÉΓòÉΓòÉ 29.2.3. Motion to an End of the Buffer ΓòÉΓòÉΓòÉ
-
- To move point to the beginning of the buffer, write:
-
- (goto-char (point-min))
-
- Likewise, to move to the end of the buffer, use:
-
- (goto-char (point-max))
-
- Here are two commands which users use to do these things. They are documented
- here to warn you not to use them in Lisp programs, because they set the mark
- and display messages in the echo area.
-
- -- Command: beginning-of-buffer &optional n
- This function moves point to the beginning of the buffer (or the limits of the
- accessible portion, when narrowing is in effect), setting the mark at the
- previous position. If n is non-nil, then it puts point n tenths of the way
- from the beginning of the buffer.
-
- In an interactive call, n is the numeric prefix argument, if provided;
- otherwise n defaults to nil.
-
- Don't use this function in Lisp programs!
-
- -- Command: end-of-buffer &optional n
- This function moves point to the end of the buffer (or the limits of the
- accessible portion, when narrowing is in effect), setting the mark at the
- previous position. If n is non-nil, then it puts point n tenths of the way
- from the end.
-
- In an interactive call, n is the numeric prefix argument, if provided;
- otherwise n defaults to nil.
-
- Don't use this function in Lisp programs!
-
-
- ΓòÉΓòÉΓòÉ 29.2.4. Motion by Text Lines ΓòÉΓòÉΓòÉ
-
- Text lines are portions of the buffer delimited by newline characters, which
- are regarded as part of the previous line. The first text line begins at the
- beginning of the buffer, and the last text line ends at the end of the buffer
- whether or not the last character is a newline. The division of the buffer into
- text lines is not affected by the width of the window, or by how tabs and
- control characters are displayed.
-
- -- Command: goto-line line
- This function moves point to the front of the lineth line, counting from line 1
- at beginning of buffer. If line is less than 1, then point is set to the
- beginning of the buffer. If line is greater than the number of lines in the
- buffer, then point is set to the end of the last line of the buffer.
-
- If narrowing is in effect, then line still counts from the beginning of the
- buffer, but point cannot go outside the accessible portion. So point is set at
- the beginning or end of the accessible portion of the text if the line number
- specifies a position that is inaccessible.
-
- The return value of goto-line is the difference between line and the line
- number of the line to which point actually was able move (before taking account
- of any narrowing). Thus, the value is positive if the scan encounters the end
- of the buffer.
-
- In an interactive call, line is the numeric prefix argument if one has been
- provided. Otherwise line is read in the minibuffer.
-
- -- Command: beginning-of-line &optional count
- This function moves point to the beginning of the current line. With an
- argument count not nil or 1, it moves forward count-1 lines and then to the
- beginning of the line.
-
- If this function reaches the end of the buffer (or of the accessible portion,
- if narrowing is in effect), it positions point at the beginning of the last
- line. No error is signaled.
-
- -- Command: end-of-line &optional count
- This function moves point to the end of the current line. With an argument
- count not nil or 1, it moves forward count-1 lines and then to the end of the
- line.
-
- If this function reaches the end of the buffer (or of the accessible portion,
- if narrowing is in effect), it positions point at the end of the last line. No
- error is signaled.
-
- -- Command: forward-line &optional count
- This function moves point forward count lines, to the beginning of the line.
- If count is negative, it moves point -count lines backward, to the beginning of
- the line.
-
- If the beginning or end of the buffer (or of the accessible portion) is
- encountered before that many lines are found, then point stops at the beginning
- or end. No error is signaled.
-
- forward-line returns the difference between count and the number of lines
- actually moved. If you attempt to move down five lines from the beginning of a
- buffer that has only three lines, point will positioned at the end of the last
- line, and the value will be 2.
-
- In an interactive call, count is the numeric prefix argument.
-
- -- Function: count-lines start end
- This function returns the number of lines between the positions start and end
- in the current buffer. If start and end are equal, then it returns 0.
- Otherwise it returns at least 1, even if start and end are on the same line.
- This is because the text between them, considered in isolation, must contain at
- least one line unless it is empty.
-
- Here is an example of using count-lines:
-
- (defun current-line ()
- "Return the vertical position of point in the selected window.
- Top line is 0. Counts each text line only once, even if it wraps."
- (+ (count-lines (window-start) (point))
- (if (= (current-column) 0) 1 0)
- -1))
- Also see the functions bolp and eolp in Near Point.
-
- These functions do not move point, but test whether it is already at the
- beginning or end of a line.
-
-
- ΓòÉΓòÉΓòÉ 29.2.5. Motion by Screen Lines ΓòÉΓòÉΓòÉ
-
- The line functions in the previous section count text lines, delimited only by
- newline characters. By contrast, these functions count screen lines, which are
- defined by the way the text appears on the screen. A text line is a single
- screen line if it is short enough to fit the width of the selected window, but
- otherwise it may occupy several screen lines.
-
- In some cases, text lines are truncated on the screen rather than continued
- onto additional screen lines. Then vertical-motion moves point just like
- forward-line. See Truncation.
-
- Because the width of a given string depends on the flags which control the
- appearance of certain characters, vertical-motion will behave differently on a
- given piece of text found in different buffers. It will even act differently
- in different windows showing the same buffer, because the width may differ and
- so may the truncation flag. See Control Char Display.
-
- -- Function: vertical-motion count
- This function moves point to the start of the screen line count screen lines
- down from the screen line containing point. If count is negative, it moves up
- instead.
-
- This function returns the number of lines moved. The value may be less in
- absolute value than count if the beginning or end of the buffer was reached.
-
- -- Command: move-to-window-line count
- This function moves point with respect to the text currently displayed in the
- selected window. Point is moved to the beginning of the screen line count
- screen lines from the top of the window. If count is negative, point moves
- either to the beginning of the line -count lines from the bottom or else to the
- last line of the buffer if the buffer ends above the specified screen position.
-
- If count is nil, then point moves to the beginning of the line in the middle of
- the window. If the absolute value of count is greater than the size of the
- window, then point moves to the place which would appear on that screen line if
- the window were tall enough. This will probably cause the next redisplay to
- scroll to bring that location onto the screen.
-
- In an interactive call, count is the numeric prefix argument.
-
- The value returned is the window line number, with the top line in the window
- numbered 0.
-
-
- ΓòÉΓòÉΓòÉ 29.2.6. The User-Level Vertical Motion Commands ΓòÉΓòÉΓòÉ
-
- A goal column is useful if you want to edit text such as a table in which you
- want to move point to a certain column on each line. The goal column affects
- the vertical text line motion commands, next-line and previous-line. See Basic
- Editing Commands.
-
- -- User Option: goal-column
- This variable holds an explicitly specified goal column for vertical line
- motion commands. If it is an integer, it specifies a column, and these
- commands try to move to that column on each line. If it is nil, then the
- commands set their own goal columns. Any other value is invalid.
-
- -- Variable: temporary-goal-column
- This variable holds the temporary goal column during a sequence of consecutive
- vertical line motion commands. It is overridden by goal-column if that is
- non-nil. It is set each time a vertical motion command is invoked, unless the
- previous command was also a vertical motion command.
-
- -- User Option: track-eol
- This variable controls how the vertical line motion commands operate when
- starting at the end of a line. If track-eol is non-nil, then vertical motion
- starting at the end of a line will keep to the ends of lines. This means
- moving to the end of each line moved onto. The value of track-eol has no
- effect if point is not at the end of a line when the first vertical motion
- command is given.
-
- track-eol has its effect by causing temporary-goal-column to be set to 9999
- instead of to the current column.
-
- -- Command: set-goal-column unset
- This command sets the variable goal-column to specify a permanent goal column
- for the vertical line motion commands. If unset is nil, then goal-column is
- set to the current column of point. If unset is non-nil, then goal-column is
- set to nil.
-
- This function is intended for interactive use; and in an interactive call,
- unset is the raw prefix argument.
-
-
- ΓòÉΓòÉΓòÉ 29.2.7. Moving over Lists and Other Balanced Expressions ΓòÉΓòÉΓòÉ
-
- Here are several functions concerned with balanced-parenthesis expressions
- (also called sexps in connection with moving across them in Emacs). The syntax
- table controls how these functions interpret various characters; see Syntax
- Tables. See Parsing Expressions, for lower-level primitives for scanning sexps
- or parts of sexps. For user-level commands, see Lists and Sexps.
-
- -- Command: forward-list arg
- Move forward across arg balanced groups of parentheses. (Other syntatic
- entities such as words or paired string quotes are ignored.)
-
- -- Command: backward-list arg
- Move backward across arg balanced groups of parentheses. (Other syntatic
- entities such as words or paired string quotes are ignored.)
-
- -- Command: up-list arg
- Move forward out of arg levels of parentheses. A negative argument means move
- backward but still to a less deep spot.
-
- -- Command: down-list arg
- Move forward down arg levels of parentheses. A negative argument means move
- backward but still go down arg level.
-
- -- Command: forward-sexp arg
- Move forward across arg balanced expressions. Balanced expressions include both
- those delimited by parentheses and other kinds, such as words and string
- constants. For example,
-
- ---------- Buffer: foo ----------
- (concat-!- "foo " (car x) y z)
- ---------- Buffer: foo ----------
-
- (forward-sexp 3)
- => nil
-
- ---------- Buffer: foo ----------
- (concat "foo " (car x) y-!- z)
- ---------- Buffer: foo ----------
-
- -- Command: backward-sexp arg
- Move backward across arg balanced expressions.
-
-
- ΓòÉΓòÉΓòÉ 29.2.8. Skipping Characters ΓòÉΓòÉΓòÉ
-
- The following two functions move point over a specified set of characters.
- For example, they are often used to skip whitespace.
-
- -- Function: skip-chars-forward character-set &optional limit
- This function moves point in the current buffer forward, skipping over a given
- set of characters. Emacs first examines the character following point; if it
- matches character-set, then point is advanced and the next character is
- examined. This continues until a character is found that does not match. The
- function returns nil.
-
- The argument character-set is like the inside of a `[...]' in a regular
- expression except that `]' is never special and `\' quotes `^', `-' or `\'.
- Thus, "a-zA-Z" skips over all letters, stopping before the first nonletter, and
- "^a-zA-Z" skips nonletters stopping before the first letter. See Regular
- Expressions.
-
- If limit is supplied (it must be a number or a marker), it specifies the
- maximum position in the buffer that point can be skipped to. Point will stop
- at or before limit.
-
- In the following example, point is initially located directly before the `T'.
- After the form is evaluated, point is located at the end of that line (between
- the `t' of `hat' and the newline). The function skips all letters and spaces,
- but not newlines.
-
- ---------- Buffer: foo ----------
- I read "-!-The cat in the hat
- comes back" twice.
- ---------- Buffer: foo ----------
-
- (skip-chars-forward "a-zA-Z ")
- => nil
-
- ---------- Buffer: foo ----------
- I read "The cat in the hat-!-
- comes back" twice.
- ---------- Buffer: foo ----------
-
- -- Function: skip-chars-backward character-set &optional limit
- This function moves point backward, skipping characters that match
- character-set. It just like skip-chars-forward except for the direction of
- motion.
-
-
- ΓòÉΓòÉΓòÉ 29.3. Excursions ΓòÉΓòÉΓòÉ
-
- It is often useful to move point ``temporarily'' within a localized portion of
- the program, or to switch buffers temporarily. This is called an excursion,
- and it is done with the save-excursion special form. This construct saves the
- current buffer and its values of point and the mark so they can be restored
- after the completion of the excursion.
-
- The forms for saving and restoring the configuration of windows are described
- elsewhere (see Window Configurations).
-
- -- Special Form: save-excursion forms...
- The save-excursion special form saves the identity of the current buffer and
- the values of point and the mark in it, evaluates forms, and finally restores
- the buffer and its saved values of point and the mark. All three saved values
- are restored even in case of an abnormal exit via throw or error (see Nonlocal
- Exits).
-
- The save-excursion special form is the standard way to switch buffers or move
- point within one part of a program and avoid affecting the rest of the program.
- It is used more than 500 times in the Lisp sources of Emacs.
-
- The values of point and the mark for other buffers are not saved by
- save-excursion, so any changes made to point and the mark in the other buffers
- will remain in effect after save-excursion exits.
-
- Likewise, save-excursion does not restore window-buffer correspondences altered
- by functions such as switch-to-buffer. One way to restore these
- correspondences, and the selected window, is to use save-window-excursion
- inside save-excursion (see Window Configurations).
-
- The value returned by save-excursion is the result of the last of forms, or nil
- if no forms are given.
-
- (save-excursion
- forms)
- ==
- (let ((old-buf (current-buffer))
- (old-pnt (point-marker))
- (old-mark (copy-marker (mark-marker))))
- (unwind-protect
- (progn forms)
- (set-buffer old-buf)
- (goto-char old-pnt)
- (set-marker (mark-marker) old-mark)))
-
-
- ΓòÉΓòÉΓòÉ 29.4. Narrowing ΓòÉΓòÉΓòÉ
-
- Narrowing means limiting the text addressable by Emacs editing commands to a
- limited range of characters in a buffer. The text that remains addressable is
- called the accessible portion of the buffer.
-
- Narrowing is specified with two buffer positions which become the beginning
- and end of the accessible portion. For most editing commands these positions
- replace the values of the beginning and end of the buffer. While narrowing is
- in effect, no text outside the accessible portion is displayed, and point
- cannot move outside the accessible portion.
-
- Values such as positions or line numbers which usually count from the
- beginning of the buffer continue to do so, but the functions which use them
- will refuse to operate on text that is inaccessible.
-
- The commands for saving buffers are unaffected by narrowing; the entire buffer
- is saved regardless of the any narrowing.
-
- -- Command: narrow-to-region start end
- This function sets the accessible portion of the current buffer to start at
- start and end at end. Both arguments should be character positions.
-
- In an interactive call, start and end are set to the bounds of the current
- region (point and the mark, with the smallest first).
-
- -- Command: narrow-to-page move-count
- This function sets the accessible portion of the current buffer to include just
- the current page. An optional first argument move-count non-nil means to move
- forward or backward by move-count pages and then narrow.
-
- In an interactive call, move-count is set to the numeric prefix argument.
-
- -- Command: widen
- This function cancels any narrowing in the current buffer, so that the entire
- contents are accessible. This is called widening. It is equivalent to the
- following expression:
-
- (narrow-to-region 1 (1+ (buffer-size)))
-
- -- Special Form: save-restriction forms...
- This special form saves the current bounds of the accessible portion, evaluates
- forms, and finally restores the saved bounds, thus restoring the same state of
- narrowing (or absence thereof) formerly in effect. The state of narrowing is
- restored even in the event of an abnormal exit via throw or error (see Nonlocal
- Exits). Therefore, this construct is a clean way to narrow a buffer
- temporarily.
-
- The value returned by save-restriction is that returned by the last of forms,
- or nil if no forms were given.
-
- *Note:* it is easy to make a mistake when using save-restriction. Read the
- entire description here before you try it.
-
- Point and the mark are not restored by this special form; use save-excursion
- for that. If you use both save-restriction and save-excursion together,
- save-excursion should come first (on the outside). Otherwise, the old point
- value would be restored with temporary narrowing still in effect. If the old
- point value were outside the limits of the temporary narrowing, this would fail
- to restore it accurately.
-
- The save-restriction special form records the values of the beginning and end
- of the accessible portion as distances from the beginning and end of the
- buffer. In other words, it records the amount of inaccessible text before and
- after the accessible portion.
-
- This technique yields correct results if the body of the form does further
- narrowing. However, save-restriction can become confused if the body widens
- and then makes changes outside the area of the saved narrowing. When this is
- what you want to do, save-restriction is not the right tool for the job. Here
- is what you must do instead:
-
- (let ((beg (point-min-marker))
- (end (point-max-marker)))
- (unwind-protect
- (progn body)
- (narrow-to-region beg end)))
-
- Here is a simple example of correct use of save-restriction:
-
- ---------- Buffer: foo ----------
- This is the contents of foo
- This is the contents of foo
- This is the contents of foo-!-
- ---------- Buffer: foo ----------
-
- (save-excursion
- (save-restriction
- (goto-char 1)
- (forward-line 2)
- (narrow-to-region 1 (point))
- (goto-char (point-min))
- (replace-string "foo" "bar")))
-
- ---------- Buffer: foo ----------
- This is the contents of bar
- This is the contents of bar
- This is the contents of foo-!-
- ---------- Buffer: foo ----------
-
-
- ΓòÉΓòÉΓòÉ 30. Markers ΓòÉΓòÉΓòÉ
-
- A marker is a Lisp object used to specify a position in a buffer relative to
- the surrounding text. A marker changes its offset from the beginning of the
- buffer automatically whenever text is inserted or deleted, so that it stays
- with the two characters on either side of it.
-
-
- ΓòÉΓòÉΓòÉ 30.1. Overview of Markers ΓòÉΓòÉΓòÉ
-
- A marker specifies a buffer and a position in that buffer. The marker can be
- used to represent a position in the functions that require one, just as an
- integer could be used. See Positions, for a complete description of positions.
-
- A marker has two attributes: the marker position, and the marker buffer. The
- marker position is an integer which is equivalent (at the moment) to the marker
- as a position in that buffer; however, as text is inserted or deleted in the
- buffer, the marker is relocated, so that its integer equivalent changes. The
- idea is that a marker positioned between two characters in a buffer will remain
- between those two characters despite any changes made to the contents of the
- buffer; thus, a marker's offset from the beginning of a buffer may change often
- during the life of the marker.
-
- If the text around a marker is deleted, the marker is repositioned between the
- characters immediately before and after the deleted text. If text is inserted
- at the position of a marker, the marker remains in front of the new text unless
- it is inserted with insert-before-markers (see Insertion). When text is
- inserted or deleted somewhere before the marker position (not next to the
- marker), the marker moves back and forth with the two neighboring characters.
-
- When a buffer is modified, all of its markers must be checked so that they can
- be relocated if necessary. This slows processing in a buffer with a large
- number of markers. For this reason, it is a good idea to make a marker point
- nowhere if you are sure you don't need it any more. Unreferenced markers will
- eventually be garbage collected, but until then will continue to be updated if
- they do point somewhere.
-
- Because it is quite common to perform arithmetic operations on a marker
- position, most of the arithmetic operations (including + and -) accept markers
- as arguments. In such cases, the current position of the marker is used.
-
- Here are examples of creating markers, setting markers, and moving point to
- markers:
-
- ;; Make a new marker that initially does not point anywhere:
- (setq m1 (make-marker))
- => #<marker in no buffer>
-
- ;; Set m1 to point between the 100th and 101st characters.
- ;; in the current buffer:
- (set-marker m1 100)
- => #<marker at 100 in markers.texi>
-
- ;; Now insert one character at the beginning of the buffer:
- (goto-char (point-min))
- => 1
- (insert "Q")
- => nil
-
- ;; m1 is updated appropriately.
- m1
- => #<marker at 101 in markers.texi>
-
- ;; Two markers that point to the same position
- ;; are not eq, but they are equal.
- (setq m2 (copy-marker m1))
- => #<marker at 101 in markers.texi>
- (eq m1 m2)
- => nil
- (equal m1 m2)
- => t
-
- ;; When you are finished using a marker, make it point nowhere.
- (set-marker m1 nil)
- => #<marker in no buffer>
-
-
- ΓòÉΓòÉΓòÉ 30.2. Predicates on Markers ΓòÉΓòÉΓòÉ
-
- You can test an object to see whether it is a marker, or whether it is either
- an integer or a marker. The latter test is useful when you are using the
- arithmetic functions that work with both markers and integers.
-
- -- Function: markerp object
- This function returns t if object is a marker, nil otherwise. In particular,
- integers are not markers, even though many functions will accept either a
- marker or an integer.
-
- -- Function: integer-or-marker-p object
- This function returns t if object is an integer or a marker, nil otherwise.
-
-
- ΓòÉΓòÉΓòÉ 30.3. Functions That Create Markers ΓòÉΓòÉΓòÉ
-
- When you create a new marker, you can make it point nowhere, or point to the
- present position of point, or to the beginning or end of the accessible portion
- of the buffer, or to the same place as another given marker.
-
- -- Function: make-marker
- This functions returns a newly allocated marker that does not point anywhere.
-
- (make-marker)
- => #<marker in no buffer>
-
- -- Function: point-marker
- This function returns a new marker that points to the present position of
- point in the current buffer. See Point. For an example, see copy-marker,
- below.
-
- -- Function: point-min-marker
- This function returns a new marker that points to the beginning of the
- accessible portion of the buffer. This will be the beginning of the buffer
- unless narrowing is in effect. See Narrowing.
-
- -- Function: point-max-marker
- This function returns a new marker that points to the end of the accessible
- portion of the buffer. This will be the end of the buffer unless narrowing is
- in effect. See Narrowing.
-
- Here are examples of this function and point-min-marker, shown in a buffer
- containing a version of the source file for the text of this chapter.
-
- (point-min-marker)
- => #<marker at 1 in markers.texi>
- (point-max-marker)
- => #<marker at 15573 in markers.texi>
-
- (narrow-to-region 100 200)
- => nil
- (point-min-marker)
- => #<marker at 100 in markers.texi>
- (point-max-marker)
- => #<marker at 200 in markers.texi>
-
- -- Function: copy-marker marker-or-integer
- If passed a marker as its argument, copy-marker returns a new marker that
- points to the same place and the same buffer as does marker-or-integer. If
- passed an integer as its argument, copy-marker returns a new marker that points
- to position marker-or-integer in the current buffer.
-
- If passed an argument that is an integer whose value is less than 1,
- copy-marker returns a new marker that points to the beginning of the current
- buffer. If passed an argument that is an integer whose value is greater than
- the length of the buffer, then copy-marker returns a new marker that points to
- the end of the buffer.
-
- An error is signaled if marker is neither a marker nor an integer.
-
- (setq p (point-marker))
- => #<marker at 2139 in markers.texi>
-
- (setq q (copy-marker p))
- => #<marker at 2139 in markers.texi>
-
- (eq p q)
- => nil
-
- (equal p q)
- => t
-
- (copy-marker 0)
- => #<marker at 1 in markers.texi>
-
- (copy-marker 20000)
- => #<marker at 7572 in markers.texi>
-
-
- ΓòÉΓòÉΓòÉ 30.4. Information from Markers ΓòÉΓòÉΓòÉ
-
- This section describes the functions for accessing the components of a marker
- object.
-
- -- Function: marker-position marker
- This function returns the position that marker points to, or nil if it points
- nowhere.
-
- -- Function: marker-buffer marker
- This function returns the buffer that marker points into, or nil if it points
- nowhere.
-
- (setq m (make-marker))
- => #<marker in no buffer>
- (marker-position m)
- => nil
- (marker-buffer m)
- => nil
-
- (set-marker m 3770 (current-buffer))
- => #<marker at 3770 in markers.texi>
- (marker-buffer m)
- => #<buffer markers.texi>
- (marker-position m)
- => 3770
-
- Two distinct markers will be found equal (even though not eq) to each other if
- they have the same position and buffer, or if they both point nowhere.
-
-
- ΓòÉΓòÉΓòÉ 30.5. Changing Markers ΓòÉΓòÉΓòÉ
-
- This section describes how to change the position of an existing marker. When
- you do this, be sure you know whether the marker is used outside of your
- program, and, if so, what effects will result from moving it---otherwise,
- confusing things may happen in other parts of Emacs.
-
- -- Function: set-marker marker position &optional buffer
- This function moves marker to position in buffer. If buffer is not provided,
- it defaults to the current buffer.
-
- If position is less than 1, set-marker moves marker to the beginning of the
- buffer. If the value of position is greater than the size of the buffer,
- set-marker moves marker to the end of the buffer. If position is nil or a
- marker that points nowhere, then marker is set to point nowhere.
-
- The value returned is marker.
-
- (setq m (point-marker))
- => #<marker at 4714 in markers.texi>
- (set-marker m 55)
- => #<marker at 55 in markers.texi>
- (setq b (get-buffer "foo"))
- => #<buffer foo>
- (set-marker m 0 b)
- => #<marker at 1 in foo>
-
- -- Function: move-marker marker position &optional buffer
- This is another name for set-marker.
-
-
- ΓòÉΓòÉΓòÉ 30.6. The Mark ΓòÉΓòÉΓòÉ
-
- A special marker in each buffer is designated the mark. It records a position
- for the user for the sake of commands such as C-w and C-x TAB. Lisp programs
- should set the mark only to values that have a potential use to the user, and
- never for their own internal purposes. For example, the replace-regexp command
- sets the mark to the value of point before doing any replacements, because this
- enables the user to move back there conveniently after the replace is finished.
-
- Many commands are designed so that when called interactively they operate on
- the text between point and the mark. If you are writing such a command, don't
- examine the mark directly; instead, use interactive with the `r' specification.
- This will provide the values of point and the mark as arguments to the command
- in an interactive call, but will permit other Lisp programs to specify
- arguments explicitly. See Interactive Codes.
-
- Each buffer has its own value of the mark that is independent of the value of
- the mark in other buffers. When a buffer is created, the mark exists but does
- not point anywhere. We consider this state as ``the absence of a mark in that
- buffer''.
-
- In addition to the mark, each buffer has a mark ring which is a list of
- markers that are the previous values of the mark. When editing commands change
- the mark, they should normally save the old value of the mark on the mark ring.
- The mark ring may contain no more than the maximum number of entries specified
- by the variable mark-ring-max; excess entries are discarded on a
- first-in-first-out basis.
-
- -- Function: mark
- This function returns the position of the current buffer's mark as an integer.
- nil is returned if the mark is not yet set for this buffer.
-
- -- Function: mark-marker
- This function returns the current buffer's mark. This the very marker which
- records the mark location inside Emacs, not a copy. Therefore, changing this
- marker's position will directly affect the position of the mark. Don't do it
- unless that is the effect you want.
-
- (setq m (mark-marker))
- => #<marker at 3420 in markers.texi>
- (set-marker m 100)
- => #<marker at 100 in markers.texi>
- (mark-marker)
- => #<marker at 100 in markers.texi>
-
- Like any marker, this marker can be set to point at any buffer you like. We
- don't recommend that you make it point at any buffer other than the one of
- which it is the mark. If you do, it will yield perfectly consistent, if rather
- odd, results.
-
- -- Command: set-mark-command jump
- If jump is nil, this command sets the mark to the value of point and pushes
- the previous value of the mark on the mark ring. The message `Mark set' is
- also displayed in the echo area.
-
- If jump is not nil, this command sets point to the value of the mark, and sets
- the mark to the previous saved mark value, which is popped off the mark ring.
-
- This function is only intended for interactive use.
-
- -- Function: set-mark position
- This function sets the mark to position. The old value of the mark is not
- pushed onto the mark ring.
-
- *Note:* use this function only if you want the user to see that the mark has
- moved, and you want the previous mark position to be lost. Normally, when a new
- mark is set, the old one should go on the mark-ring, which is why most
- applications should use push-mark and pop-mark, not set-mark.
-
- Novice Emacs Lisp programmers often try to use the mark for the wrong
- purposes. The mark saves a location for the user's convenience. An editing
- command should not alter the mark unless altering the mark is part of the
- user-level functionality of the command. (And, in that case, this effect
- should be documented.) To remember a location for internal use in the Lisp
- program, store it in a Lisp variable. For example:
-
- (let ((beg (point)))
- (forward-line 1)
- (delete-region beg (point))).
-
- -- Variable: mark-ring
- The value of this buffer-local variable is the list of saved former marks of
- the current buffer, most recent first.
-
- mark-ring
- => (#<marker at 11050 in markers.texi>
- #<marker at 10832 in markers.texi>
- ...)
-
- -- User Option: mark-ring-max
- The value of this variable is the maximum size of mark-ring. If more marks
- than this are pushed onto the mark-ring, it discards marks on a first-in,
- first-out basis.
-
- -- Function: push-mark &optional position nomsg
- This function sets the current buffer's mark to position, and pushes a copy of
- the previous mark onto mark-ring. If position is nil, then the value of point
- is used. push-mark returns nil.
-
- A `Mark set' message is displayed unless nomsg is non-nil.
-
- -- Function: pop-mark
- This function pops off the top element of mark-ring and makes that mark become
- the buffer's actual mark. This does not change the buffer's point and does
- nothing if mark-ring is empty.
-
- The return value is not useful.
-
-
- ΓòÉΓòÉΓòÉ 30.7. The Region ΓòÉΓòÉΓòÉ
-
- The text between point and the mark is known as the region. Various functions
- operate on text delimited by point and the mark, but only those functions
- specifically related to the region itself are described here.
-
- -- Function: region-beginning
- This function returns the position of the beginning of the region (as an
- integer). This is the position of either point or the mark, whichever is
- smaller.
-
- If the mark does not point anywhere, an error is signaled.
-
- -- Function: region-end
- This function returns the position of the end of the region (as an integer).
- This is the position of either point or the mark, whichever is larger.
-
- If the mark does not point anywhere, an error is signaled.
-
- Few programs need to use the region-beginning and region-end functions. A
- command designed to operate on a region should instead use interactive with the
- `r' specification, so that the same function can be called with explicit bounds
- arguments from programs. (See Interactive Codes.)
-
-
- ΓòÉΓòÉΓòÉ 31. Text ΓòÉΓòÉΓòÉ
-
- This chapter describes the functions that deal with the text in a buffer.
- Most examine, insert or delete text in the current buffer, often in the
- vicinity of point. Many are interactive. All the functions that change the
- text provide for undoing the changes (see Undo).
-
- Many text-related functions operate on a region of text defined by two buffer
- positions passed in arguments named start and end. These arguments should be
- either markers (see Markers) or or numeric character positions (see Positions).
- The order of these arguments does not matter; it is all right for start to be
- the end of the region and end the beginning. For example, (delete-region 1 10)
- and (delete-region 10 1) perform identically. An args-out-of-range error is
- signaled if either start or end is outside the accessible portion of the
- buffer. In an interactive call, point and the mark are used for these
- arguments.
-
- Throughout this chapter, ``text'' refers to the characters in the buffer.
-
-
- ΓòÉΓòÉΓòÉ 31.1. Examining Text Near Point ΓòÉΓòÉΓòÉ
-
- Many functions are provided to look at the characters around point. Several
- simple functions are described here. See also looking-at in Searching and
- Matching.
-
- -- Function: char-after position
- This function returns the character in the current buffer at (i.e.,
- immediately after) position position. If position is out of range for this
- purpose, either before the beginning of the buffer, or at or beyond the end,
- than the value is nil.
-
- Remember that point is always between characters, and the terminal cursor
- normally appears over the character following point. Therefore, the character
- returned by char-after is the character the cursor is over.
-
- In the following example, assume that 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 at the end of the
- buffer, then the result of following-char is 0.
-
- In this example, point is between the `a' and the `c'.
-
- ---------- Buffer: foo ----------
- Gentlemen may cry ``Pea-!-ce! Peace!,'' but there is no peace.
- ---------- Buffer: foo ----------
-
- (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 above, under following-char, for an example. If point is at the beginning
- of the buffer, then the result of preceding-char is 0.
-
- -- Function: bobp
- This function returns t if point is at the beginning of the buffer. If
- narrowing is in effect, this means the beginning of the accessible portion of
- the text. See also point-min in Point.
-
- -- Function: eobp
- This function returns t if point is at the end of the buffer. If narrowing is
- in effect, this means the end of accessible portion of the text. See also
- point-max in See Point.
-
- -- Function: bolp
- This function returns t if point is at the beginning of a line. See Text
- Lines.
-
- -- Function: eolp
- This function returns t if point is at the end of a line. The end of the
- buffer is always considered the end of a line.
-
-
- ΓòÉΓòÉΓòÉ 31.2. Examining Buffer Contents ΓòÉΓòÉΓòÉ
-
- This section describes two functions that allow a Lisp program to convert any
- portion of the text in the buffer into a string.
-
- -- Function: buffer-substring start end
- This function returns a string containing a copy of the text of the region
- defined by positions start and end in the current buffer. If the arguments are
- not positions in the accessible portion of the buffer, Emacs signals an
- args-out-of-range error.
-
- It is not necessary for start to be less than end; the arguments can be given
- in either order. But most often the smaller argument is written first.
-
- ---------- Buffer: foo ----------
- This is the contents of buffer foo
-
- ---------- Buffer: foo ----------
-
- (buffer-substring 1 10)
- => "This is t"
- (buffer-substring (point-max) 10)
- => "he contents of buffer foo
- "
-
- -- Function: buffer-string
- This function returns the contents of the accessible portion of the current
- buffer as a string. This is the portion between (point-min) and (point-max)
- (see Narrowing).
-
- ---------- Buffer: foo ----------
- This is the contents of buffer foo
-
- ---------- Buffer: foo ----------
-
- (buffer-string)
- => "This is the contents of buffer foo
- "
-
-
- ΓòÉΓòÉΓòÉ 31.3. Insertion ΓòÉΓòÉΓòÉ
-
- Insertion takes place at point. Markers pointing at positions after the
- insertion point are relocated with the surrounding text (see Markers). When a
- marker points at the place of insertion, it is normally not relocated, so that
- it points to the beginning of the inserted text; however, when
- insert-before-markers is used, all such markers are relocated to point after
- the inserted text.
-
- Point may end up either before or after inserted text, depending on the
- function used. If point is left after the inserted text, we speak of insertion
- before point.
-
- Each of these functions signals an error if the current buffer is read-only.
-
- -- Function: insert &rest args
- This function inserts the strings and/or characters args into the current
- buffer, at point, moving point forward. An error is signaled unless all args
- are either strings or characters. The value is nil.
-
- -- Function: insert-before-markers &rest args
- This function inserts the strings and/or characters args into the current
- buffer, at point, moving point forward. An error is signaled unless all args
- are either strings or characters. The value is nil.
-
- This function is unlike the other insertion functions in that a marker whose
- position initially equals point is relocated to come after the newly inserted
- text.
-
- -- Function: insert-char character count
- This function inserts count instances of character into the current buffer
- before point. count must be a number, and character must be a character. The
- value is nil.
-
- -- Function: insert-buffer-substring from-buffer-or-name start end
- This function inserts a substring of the contents of buffer from-buffer-or-name
- (which must already exist) into the current buffer before point. The text
- inserted consists of the characters in the region defined by start and end.
- The value is nil.
-
- In this example, the form is executed with buffer `bar' as the current buffer.
- We assume that buffer `bar' is initially empty.
-
- ---------- Buffer: foo ----------
- We hold these truths to be self-evident, that all
- ---------- Buffer: foo ----------
-
- (insert-buffer-substring "foo" 1 20)
- => nil
-
- ---------- Buffer: bar ----------
- We hold these truth
- ---------- Buffer: bar ----------
-
-
- ΓòÉΓòÉΓòÉ 31.4. User-Level Insertion Commands ΓòÉΓòÉΓòÉ
-
- This section describes higher-level commands for inserting text, commands
- intended primarily for the user but useful also in Lisp programs.
-
- -- Command: insert-buffer from-buffer-or-name
- This function inserts the entire contents of from-buffer-or-name (which must
- exist) into the current buffer after point. It leaves the mark after the
- inserted text. The value is unpredictable.
-
- -- Command: quoted-insert count
- This function reads the next input character verbatim and inserts it. It is
- primarily useful for inserting control characters. You may also type up to 3
- octal digits, to insert a character with that code.
-
- The argument count is the number of these characters to insert. An error is
- signaled if count is not a number.
-
- This function is primarily for interactive use; there is no reason to use it in
- a program except for installing it on a keymap. It returns nil.
-
- -- Command: self-insert-command count
- This function inserts the last character typed count times and returns nil.
- This is the function that most printing characters are bound to. In routine
- use, self-insert-command is the most frequently called function in Emacs, but
- programs rarely use it except to install it on a keymap.
-
- In an interactive call, count is the numeric prefix argument.
-
- This function calls auto-fill-hook if the current column number is greater than
- the value of fill-column and the character inserted is a space (see Auto
- Filling).
-
- This function performs abbrev expansion if Abbrev mode (see Abbrevs) is enabled
- and the inserted character does not have word-constituent syntax (see Syntax
- Class Table).
-
- This function is also responsible for calling the blink-paren-hook when the
- inserted character has close parenthesis syntax (see Blinking).
-
- -- Command: newline &optional number-of-newlines
- This function inserts newlines into the current buffer before point. If
- number-of-newlines is supplied, that many newline characters are inserted.
-
- In Auto Fill mode, newline can break the preceding line if number-of-newlines
- is not supplied. When this happens, it actually inserts two newlines at
- different places: one at point, and another earlier in the line. newline does
- not auto-fill if number-of-newlines is non-nil.
-
- The value returned is nil. In an interactive call, count is the numeric prefix
- argument.
-
- -- Command: split-line
- This function splits the current line, moving the portion of the line after
- point down vertically, so that it is on the next line directly below where it
- was before. Whitespace is inserted as needed at the beginning of the lower
- line, using the indent-to function. split-line returns the position of point.
-
- Programs hardly ever use this function.
-
- -- Command: open-line count
- This function inserts count newlines into the current buffer after point,
- leaving point where it was.
-
- In an interactive call, count is the numeric prefix argument. Programs hardly
- ever use this function. The value is unpredictable.
-
- -- Command: overwrite-mode argument
- This function turns Overwrite mode on or off. If argument is nil then the mode
- is toggled. Otherwise, if argument is a positive number (greater than zero),
- then the mode is turned on; any other argument turns it off.
-
- When Overwrite mode is on, self-inserting graphic characters replace existing
- text character for character, and do not push the existing text to the right.
-
- This function affects primarily self-insert-command.
-
- In an interactive call, argument is set to the raw prefix argument. The return
- value of overwrite-mode is unpredictable.
-
- -- Variable: overwrite-mode
- Overwrite mode is in effect when this variable is non-nil. It is automatically
- made buffer-local when set in any fashion.
-
-
- ΓòÉΓòÉΓòÉ 31.5. Deletion of Text ΓòÉΓòÉΓòÉ
-
- All of the deletion functions operate on the current buffer, and all return a
- value of nil. In addition to these functions, you can also delete text using
- the ``kill'' functions that save it in the kill ring for the user; some of
- these functions save text in the kill ring in some cases but not in the usual
- case. See The Kill Ring.
-
- -- Function: erase-buffer
- This function deletes the entire text of the current buffer, leaving it empty.
- If the buffer is read-only, it signals a buffer-read-only error. Otherwise the
- text is deleted with no confirmation required. The value is always nil.
-
- As a safety measure, this function is not interactively callable.
-
- -- Command: delete-region start end
- This function deletes the text in the current buffer in the region defined by
- start and end. The value is nil.
-
- -- Command: delete-char count &optional killp
- This function deletes count characters directly after point, or before point if
- count is negative. If killp is non-nil, then it saves the deleted characters
- in the kill ring.
-
- In an interactive call, count is the numeric prefix argument, and killp is the
- unprocessed prefix argument. Therefore, if a prefix argument is supplied, the
- text is saved in the kill ring. If no prefix argument is supplied, then one
- character is deleted, but not saved in the kill ring.
-
- The value returned is always nil.
-
- -- Command: delete-backward-char count &optional killp
- This function deletes count characters directly before point, or after point if
- count is negative. If killp is non-nil, then it saves the deleted characters
- in the kill ring.
-
- In an interactive call, count is the numeric prefix argument, and killp is the
- unprocessed prefix argument. Therefore, if a prefix argument is supplied, the
- text is saved in the kill ring. If no prefix argument is supplied, then one
- character is deleted, but not saved in the kill ring.
-
- The value returned is always nil.
-
- -- Command: backward-delete-char-untabify count &optional killp
- This function deletes count characters backward, changing tabs into spaces.
- When the next character to be deleted is a tab, it is first replaced with the
- proper number of spaces to preserve alignment and then one of those spaces is
- deleted instead of the tab. If killp is non-nil, then the command saves the
- deleted characters in the kill ring.
-
- If count is negative, then tabs are not changed to spaces, and the characters
- are deleted by calling delete-backward-char with count.
-
- In an interactive call, count is the numeric prefix argument, and killp is the
- unprocessed prefix argument. Therefore, if a prefix argument is supplied, the
- text is saved in the kill ring. If no prefix argument is supplied, then one
- character is deleted, but not saved in the kill ring.
-
- The value returned is always nil.
-
-
- ΓòÉΓòÉΓòÉ 31.6. User-Level Deletion Commands ΓòÉΓòÉΓòÉ
-
- This section describes higher-level commands for deleting text, commands
- intended primarily for the user but useful also in Lisp programs.
-
- -- Command: delete-horizontal-space
- This function deletes all spaces and tabs around point. It returns nil.
-
- In the following examples, assume that delete-horizontal-space is called four
- times, once on each line, with point between the second and third characters on
- the line.
-
- ---------- Buffer: foo ----------
- I -!-thought
- I -!- thought
- We-!- thought
- Yo-!-u thought
- ---------- Buffer: foo ----------
-
- (delete-horizontal-space) ; Four times.
- => nil
-
- ---------- Buffer: foo ----------
- Ithought
- Ithought
- Wethought
- You thought
- ---------- Buffer: foo ----------
-
- -- Command: delete-indentation &optional join-following-p
- This function joins the line point is on to the previous line, deleting any
- whitespace at the join and in some cases replacing it with one space. If
- join-following-p is non-nil, delete-indentation joins this line to following
- line instead. The value is nil.
-
- In the example below, point is located on the line starting `events', and it
- makes no difference if there are trailing spaces in the preceding line.
-
- ---------- Buffer: foo ----------
- When in the course of human
- -!- events, it becomes necessary
- ---------- Buffer: foo ----------
-
- (delete-indentation)
- => nil
-
- ---------- Buffer: foo ----------
- When in the course of human-!- events, it becomes necessary
- ---------- Buffer: foo ----------
-
- After the lines are joined, the function fixup-whitespace is responsible for
- deciding whether to leave a space at the junction.
-
- -- Function: fixup-whitespace
- This function replaces white space between the objects on either side of point
- with either one space or no space as appropriate. It returns nil.
-
- The appropriate amount of space is none at the beginning or end of the line.
- Otherwise, it is one space except when point is before a character with close
- parenthesis syntax or after a character with open parenthesis or
- expression-prefix syntax. See Syntax Class Table.
-
- In the example below, point is at the beginning of the second line when
- fixup-whitespace is called the first time. It is located directly after the
- `(' for the second invocation.
-
- ---------- Buffer: foo ----------
- This has too many spaces
- -!- at the front of this line
- This has too many spaces at the start of (-!- this list)
- ---------- Buffer: foo ----------
-
- (fixup-whitespace)
- => nil
- (fixup-whitespace)
- => nil
-
- ---------- Buffer: foo ----------
- This has too many spaces
- at the front of this line
- This has too many spaces at the start of (this list)
- ---------- Buffer: foo ----------
-
- -- Command: just-one-space
- This command replaces any spaces and tabs around point with a single space. It
- returns nil.
-
- -- Command: delete-blank-lines
- This function deletes blank lines surrounding point. If point is on a blank
- line with one or more blank lines before or after it, then all but one of them
- are deleted. If point is on an isolated blank line, then it is deleted. If
- point is on a nonblank line, the command deletes all blank lines following it.
-
- A blank line is defined as a line containing only tabs and spaces.
-
- delete-blank-lines returns nil.
-
-
- ΓòÉΓòÉΓòÉ 31.7. The Kill Ring ΓòÉΓòÉΓòÉ
-
- Kill functions delete text like the deletion functions, but save it so that
- the user can reinsert it by yanking. Most of these functions have `kill-' in
- their name. By contrast, the functions whose names start with `delete-'
- normally do not save text for yanking (though they can still be undone); these
- are ``deletion'' functions.
-
- Most of the kill commands are primarily for interactive use, and are not
- described here. What we do describe are the functions provided for use in
- writing such commands. When deleting text for internal purposes within a Lisp
- function, you should normally use deletion functions, so as not to disturb the
- kill ring contents. See Deletion.
-
- Emacs saves the last several batches of killed text in a list. We call it the
- kill ring because, in yanking, the elements are considered to be in a cyclic
- order. The list is kept in the variable kill-ring, and can be operated on with
- the usual functions for lists; there are also specialized functions, described
- in this section, which treat it as a ring.
-
- Some people think use of the word ``kill'' in Emacs is unfortunate, since it
- refers to processes which specifically do not destroy the entities ``killed''.
- This is in sharp contrast to ordinary life, in which death is permanent and
- ``killed'' entities do not come back to life. Therefore, other metaphors have
- been proposed. For example, the term ``cut ring'' makes sense to people who,
- in pre-computer days, used scissors and paste to cut up and rearrange
- manuscripts. However, it would be difficult to change now.
-
-
- ΓòÉΓòÉΓòÉ 31.7.1. Data Structures in the Kill Ring ΓòÉΓòÉΓòÉ
-
- Killed text is kept as strings in a list. A short kill ring, for example,
- might look like this:
-
- ("some text" "a different piece of text" "yet more text")
-
- Functions that push more text into the list make the text in question into a
- string (using buffer-substring), add the string to the front of the list, and
- then look at the length of the list. If the length is longer than the value of
- kill-ring-max, the last entry in the list is dropped off when the new entry is
- put on.
-
- The kill-ring-yank-pointer global variable points to the kill ring entry that
- a yank function will copy. Several functions move this pointer from one entry
- to another, and a user can thereby specify which entry to copy.
-
- Here is a diagram that shows the variable kill-ring-yank-pointer pointing to
- the second entry in the kill ring ("some text" "a different piece of text" "yet
- more text").
-
- kill-ring kill-ring-yank-pointer
- | |
- | ___ ___ ---> ___ ___ ___ ___
- --> |___|___|------> |___|___|--> |___|___|--> nil
- | | |
- | | |
- | | -->"yet more text"
- | |
- | --> "a different piece of text"
- |
- --> "some text"
-
- (This circumstance occurs after C-y (yank) is immediately followed by M-y
- (yank-pop).)
-
- Both kill-ring and kill-ring-yank-pointer are Lisp variables whose values are
- normally lists. The word ``pointer'' in the name of the kill-ring-yank-pointer
- indicates that the variable's purpose is to identify one element of the list
- that will be used by default by the next yank command. The value of
- kill-ring-yank-pointer is always eq to one of the links in the kill ring list.
- The element it identifies is the car of that link.
-
- Moving kill-ring-yank-pointer to a different link is called rotating the kill
- ring. The functions that do this treat the kill ring (which is a list) as
- ring; that is to say, a change that would otherwise move the pointer past the
- end of the list (which would be useless) instead moves the pointer to the first
- link on the list. Likewise, moving back from the first link goes to the last
- one.
-
- kill-region is the primitive method of killing text. Any command that calls
- this function is a ``kill command'' (and should probably have the word ``kill''
- in its name). kill-region puts the newly killed text in a new element at the
- beginning of the kill-ring list, and then sets kill-ring-yank-pointer to point
- to the first link of the list, which contains the first element. Consequently,
- the next yank command will yank the text just killed. In this situation,
- kill-ring and kill-ring-yank-pointer are eq to each other.
-
- When kill commands are interwoven with other commands, the killed portions of
- text are put into separate entries in the kill ring. But when two or more kill
- commands are executed in sequence, the text killed by the second (or third,
- etc.) kill command is appended to the text killed by the first command so as to
- make one entry in the kill ring. The kill-region function uses the last-command
- variable to keep track of whether the previous was a kill command, and in such
- cases appends the killed text to the most recent entry.
-
-
- ΓòÉΓòÉΓòÉ 31.7.2. Functions for Killing ΓòÉΓòÉΓòÉ
-
- -- Command: kill-region start end
- This function kills the text in the region defined by start and end. The text
- is deleted but saved in the kill ring. The value is always nil.
-
- In an interactive call, start and end are point and the mark.
-
- -- Command: kill-line &optional count
- This function kills the rest of the line following point, not including the
- newline. If point is directly before a newline, or if there is only whitespace
- between point and the newline, then it kills the whitespace and newline.
-
- If count is supplied, then the command kills that many lines (including the
- newline). (This makes executing (kill-line 2) different from executing
- (kill-line) twice.) If count is negative, then kill-line kills lines
- backwards.
-
- In an interactive call, count is the raw prefix argument (which then gets
- converted to a number if non-nil). The value is always nil.
-
- -- Command: zap-to-char count character
- In Emacs version 18, this function kills the text from point up to but not
- including the specified character. Thus, if the cursor is at the beginning of
- this sentence and the character is `s', `Thu' is deleted. If the argument is
- 2, `Thus, if the cur' is deleted, up to but not including the `s' in `cursor'.
-
- In Emacs version 19, this function will kill all text in the region from point
- up to and including the next count occurrences of character. Thus, in the
- example shown in the previous paragraph, the terminating `s' will be removed.
-
- The version 18 implementation kills text to the end of the buffer if the
- specified character is not found, but the version 19 implementation will simply
- signal an error.
-
- The function scans backward from point if count is negative. The value is
- always nil.
-
- -- Command: copy-region-as-kill start end
- This function saves the region defined by start and end on the kill ring, but
- does not delete the text from the buffer. It returns nil.
-
- In an interactive call, start and end are point and the mark.
-
-
- ΓòÉΓòÉΓòÉ 31.7.3. Functions for Yanking ΓòÉΓòÉΓòÉ
-
- -- Command: yank &optional arg
- This function inserts the text in the first entry in the kill ring directly
- before point. After the yank, the mark is positioned at the beginning and
- point is positioned after the end of the inserted text.
-
- If arg is a list (which occurs interactively when the user types C-u with no
- digits), then yank inserts the text as described above, but puts point before
- the yanked text and puts the mark after it. If arg is a number, then yank
- inserts the argth most recently killed text.
-
- yank does not alter the contents of the kill ring or rotate it. It returns
- nil.
-
- -- Command: yank-pop arg
- This function replaces the just-yanked text with another batch of killed
- text---another element of the kill ring.
-
- This command is allowed only immediately after a yank or a yank-pop. At such a
- time, the region contains text that was just inserted by the previous yank.
- yank-pop deletes that text and inserts in its place a different stretch of
- killed text. The text that is deleted is not inserted into the kill ring,
- since it is already in the kill ring somewhere.
-
- If arg is nil, then the existing region contents are replaced with the
- previous element of the kill ring. If arg is numeric, then the arg'th previous
- kill is the replacement. If arg is negative, a more recent kill is the
- replacement.
-
- The sequence of kills in the kill ring wraps around, so that after the oldest
- one comes the newest one, and before the newest one goes the oldest.
-
- The value is always nil.
-
-
- ΓòÉΓòÉΓòÉ 31.7.4. Internals of the Kill Ring ΓòÉΓòÉΓòÉ
-
- This section describes the lower levels of the kill ring.
-
- -- Variable: kill-ring
- List of killed text sequences, most recently killed first.
-
- -- Variable: kill-ring-yank-pointer
- This variable's value indicates which element of the kill ring is the
- ``front'' of the ring. More precisely, the value is a sublist of the value of
- kill-ring, and its car is the kill string at the front of the ring. Rotating
- the ring works by changing kill-ring-yank-pointer, and does not actually change
- the value of kill-ring.
-
- Commands which do change the kill ring also copy the new kill ring value into
- this variable. The effect is to rotate the ring so that the newly killed text
- is at front.
-
- -- Command: rotate-yank-pointer count
- This function rotates the kill ring count positions, which means setting
- kill-ring-yank-pointer to some other link in the kill ring list. It returns
- the new value of kill-ring-yank-pointer.
-
- -- User Option: kill-ring-max
- The value of this variable is the maximum length to which the kill ring can
- grow, before elements are thrown away on a first-in, first-out basis. The
- default value for kill-ring-max is 30.
-
-
- ΓòÉΓòÉΓòÉ 31.8. Undo ΓòÉΓòÉΓòÉ
-
- Most buffers have an undo stack which records all changes made to the buffer's
- text so that they can be undone. (In general, all buffers have undo stacks
- except special-purpose buffers for which Emacs assumes that undoing is not
- useful.) The size of an undo stack is limited, so large changes or a large
- number of changes cannot be undone.
-
- Undoing an old change is itself a change, and is added to the undo stack.
- However, you are not limited to undoing just the single most recent change; you
- can keep undoing older and older changes, even as the undo's themselves are
- being added to the stack.
-
- -- Command: undo &optional arg
- This is a user-level command to undo some previous changes. It uses undo-more
- and undo-start. By repeating this command you can undo earlier and earlier
- changes, until the information in the undo stack is used up. A numeric
- argument serves as a repeat count. The value is unpredictable.
-
- -- Function: undo-boundary
- This function places a boundary between units of undo. The undo command stops
- at such a boundary, and successive undo commands will undo to earlier and
- earlier boundaries. The return value is nil.
-
- The editor command loop automatically creates an undo boundary between
- keystroke commands. Thus, each undo normally undoes the effects of one
- command. Calling this function explicitly is useful for splitting the effects
- of a command into more than one unit. For example, query-replace calls this
- function after each replacement so that the user can undo individual
- replacements one by one.
-
- -- Function: undo-more count
- This function is used to undo count additional units of undo. It is not safe
- if the buffer has been changed in any fashion other than undo since the last
- call to undo-start. Multiple calls to undo-more have a cumulative effect,
- undoing farther back in time. The return value is nil.
-
- -- Function: undo-start
- This function prepares to undo one or more units of undo describing the most
- recent changes to the current buffer. It does not actually undo anything (or
- change the buffer at all); only undo-more does that. It returns nil.
-
- One use of this function is to break a sequence of undo's, so a subsequent
- call to undo-more will undo the recent run of undoing, rather than extend it
- into the past.
-
- The command undo calls undo-start whenever the previous command was not an
- undo.
-
- -- Command: buffer-enable-undo &optional buffer-or-name
- This function assigns an undo stack for buffer buffer-or-name, so that
- subsequent changes can be undone. If no argument is supplied, then the current
- buffer is used. If the buffer already has an undo stack, nothing is changed.
- This function returns nil.
-
- In an interactive call, buffer-or-name is the current buffer. You cannot
- specify any other buffer.
-
- -- Function: buffer-flush-undo buffer
- This function deassigns the undo stack of the buffer buffer, so that it will
- not take up space. As a result, it is no longer possible to undo either
- previous changes or any subsequent changes. If the buffer already has no undo
- stack, then this function has no effect.
-
- This function returns nil. It cannot be called interactively.
-
-
- ΓòÉΓòÉΓòÉ 31.9. Filling ΓòÉΓòÉΓòÉ
-
- Filling means adjusting the lengths of lines (by moving words between them) so
- that they are nearly (but no greater than) a specified maximum width.
- Additionally, lines can be justified, which means that spaces are inserted
- between words to make the line exactly the specified width. The width is
- controlled by the variable fill-column. For ease of reading, lines should be
- no longer than 70 or so columns.
-
- You can use Auto Fill mode (see Auto Filling) to fill text automatically as
- you insert it, but changes to existing text may leave it improperly filled.
- Then you must fill the text explicitly.
-
- Most of the functions in this section return values that are not meaningful.
-
- -- Command: fill-paragraph justify-flag
- This function fills the paragraph at or after point. If justify-flag is
- non-nil, each line is justified as well.
-
- -- Command: fill-region start end &optional justify-flag
- This function fills each of the paragraphs in the region from start to end.
- It justifies as well if justify-flag is non-nil. (In an interactive call, this
- is true if there is a prefix argument.)
-
- The variable paragraph-separate controls how to distinguish paragraphs.
-
- -- Command: fill-individual-paragraphs start end &optional justify-flag
- mail-flag
- This function fills each paragraph in the region according to its individual
- fill prefix. Thus, if the lines of a paragraph are indented with spaces, the
- filled paragraph will continue to be indented in the same fashion.
-
- The first two arguments, start and end, are the beginning and end of the
- region that will be filled. The third and fourth arguments, justify-flag and
- mail-flag, are optional. If justify-flag is non-nil, the paragraphs are
- justified as well as filled. If mail-flag is non-nil, the function is told
- that it is operating on a mail message and therefore should not fill the header
- lines.
-
- -- Command: fill-region-as-paragraph start end &optional justify-flag
- This function considers a region of text as a paragraph and fills it. If the
- region was made up of many paragraphs, the blank lines between paragraphs are
- removed. This function justifies as well as filling when justify-flag is
- non-nil. In an interactive call, any prefix argument requests justification.
-
- -- Command: justify-current-line
- This function inserts spaces between the words of the current line so that the
- line ends exactly at fill-column. It returns nil.
-
- -- User Option: fill-column
- This buffer-local variable specifies the maximum width of filled lines. Its
- value should be an integer, which is a number of columns. All the filling,
- justification and centering commands are affected by this variable, including
- Auto Fill mode (see Auto Filling).
-
- As a practical matter, if you are writing text for other people to read, you
- should set fill-column to no more than 70. Otherwise the line will be too long
- for people to read comfortably, and this can make the text seem clumsy.
-
- -- Variable: default-fill-column
- The value of this variable is the default value for fill-column in buffers
- that do not override it. This is the same as (default-value 'fill-column).
-
- The default value for default-fill-column is 70.
-
-
- ΓòÉΓòÉΓòÉ 31.10. Auto Filling ΓòÉΓòÉΓòÉ
-
- Filling breaks text into lines that are no more than a specified number of
- columns wide. Filled lines end between words, and therefore may have to be
- shorter than the maximum width.
-
- Auto Fill mode is a minor mode in which Emacs fills lines automatically as
- text as inserted. This section describes the hook and the two variables used
- by Auto Fill mode. For a description of functions that you can call manually
- to fill and justify text, see Filling.
-
- -- Variable: auto-fill-hook
- The value of this variable should be a function (of no arguments) to be called
- after self-inserting a space at a column beyond fill-column. It may be nil, in
- which case nothing special is done.
-
- The default value for auto-fill-hook is do-auto-fill, a function whose sole
- purpose is to implement the usual strategy for breaking a line.
-
- Since auto-fill-hook is not called by the run-hooks function, it will be
- renamed auto-fill-function in Version 19.
-
-
- ΓòÉΓòÉΓòÉ 31.11. Sorting Text ΓòÉΓòÉΓòÉ
-
- The sorting commands described in this section all rearrange text in a buffer.
- This is in contrast to the function sort, which rearranges the order of the
- elements of a list (see Rearrangement). The values returned by these commands
- are not meaningful.
-
- -- Command: sort-regexp-fields reverse record-regexp key-regexp start end
- This command sorts the region between start and end alphabetically as
- specified by record-regexp and key-regexp. If reverse is a negative integer,
- then sorting is in reverse order.
-
- Alphabetical sorting means that two sort keys are compared by comparing the
- first characters of each, the second characters of each, and so on. If a
- mismatch is found, it means that the sort keys are unequal; the sort key whose
- character is less at the point of first mismatch is the lesser sort key. The
- individual characters are compared according to their numerical values. Since
- Emacs uses the ASCII character set, the ordering in that set determines
- alphabetical order.
-
- The value of the record-regexp argument specifies the textual units or records
- that should be sorted. At the end of each record, a search is done for this
- regular expression, and the text that matches it is the next record. For
- example, the regular expression `^.+$', which matches lines with at least one
- character besides a newline, would make each such line into a sort record. See
- Regular Expressions, for a description of the syntax and meaning of regular
- expressions.
-
- The value of the key-regexp argument specifies what part of each record is to
- be compared against the other records. The key-regexp could match the whole
- record, or only a part. In the latter case, the rest of the record has no
- effect on the sorted order of records, but it is carried along when the record
- moves to its new position.
-
- The key-regexp argument can refer to the text matched by a subexpression of
- record-regexp, or it can be a regular expression on its own.
-
- If key-regexp is:
-
- `\digit'
- then the text matched by the digitth `\(...\)' parenthesis grouping
- in record-regexp is used for sorting.
-
- `\&'
- then the whole record is used for sorting.
-
- a regular expression
- then the function searches for a match for the regular expression
- within the record. If such a match is found, it is used for sorting.
- If a match for key-regexp is not found within a record then that
- record is ignored, which means its position in the buffer is not
- changed. (The other records may move around it.)
-
- For example, if you plan to sort all the lines in the region by the first word
- on each line starting with the letter `f', you should set record-regexp to
- `^.*$' and set key-regexp to `\<f\w*\>'. The resulting expression looks like
- this:
-
- (sort-regexp-fields nil "^.*$" "\\<f\\w*\\>"
- (region-beginning)
- (region-end))
-
- If you call sort-regexp-fields interactively, you are prompted for
- record-regexp and key-regexp in the minibuffer.
-
- -- Command: sort-subr reverse nextrecfun endrecfun &optional startkeyfun
- endkeyfun
- This command is the general text sorting routine that divides a buffer into
- records and sorts them. The functions sort-lines, sort-paragraphs, sort-pages,
- sort-fields, sort-regexp-fields and sort-numeric-fields all use sort-subr.
-
- To understand how sort-subr works, consider the whole accessible portion of
- the buffer as being divided into disjoint pieces called sort records. A
- portion of each sort record (perhaps all of it) is designated as the sort key.
- The records are rearranged in the buffer in order by their sort keys. The
- records may or may not be contiguous.
-
- Usually, the records are rearranged in order of ascending sort key. If the
- first argument to the sort-subr function, reverse, is non-nil, the sort records
- are rearranged in order of descending sort key.
-
- The next four arguments to sort-subr are functions that are called to move
- point across a sort record. They are called many times from within sort-subr.
-
- 1. nextrecfun is called with point at the end of a record. This function
- moves point to the start of the next record. The first record is assumed
- to start at the position of point when sort-subr is called. (Therefore,
- you should usually move point to the beginning of the buffer before calling
- sort-subr.)
-
- 2. endrecfun is called with point within a record. It moves point to the end
- of the record.
-
- 3. startkeyfun is called to move point from the start of a record to the start
- of the sort key. This argument is optional. If supplied, the function
- should either return a non-nil value to be used as the sort key, or return
- nil to indicate that the sort key is in the buffer starting at point. In
- the latter case, and endkeyfun will be called to find the end of the sort
- key.
-
- 4. endkeyfun is called to move point from the start of the sort key to the end
- of the sort key. This argument is optional. If startkeyfun returns nil
- and this argument is omitted (or nil), then the sort key extends to the end
- of the record. There is no need for endkeyfun if startkeyfun returns a
- non-nil value.
-
- As an example of sort-subr, here is the complete function definition for
- sort-lines:
-
- (defun sort-lines (reverse beg end)
- "Sort lines in region alphabetically; arg means reverse order.
- Called from a program, there are three arguments:
- REVERSE (non-nil means reverse order),
- and BEG and END (the region to sort)."
- (interactive "P\nr")
- (save-restriction
- (narrow-to-region beg end)
- (goto-char (point-min))
- (sort-subr reverse 'forward-line 'end-of-line)))
-
- Here forward-line moves point to the start of the next record, and end-of-line
- moves point to the end of record. We do not pass the arguments startkeyfun and
- endkeyfun, because the entire record is used as the sort key.
-
- The sort-paragraphs function is very much the same, except that its sort-subr
- call looks like this:
-
- (sort-subr reverse
- (function (lambda () (skip-chars-forward "\n \t\f")))
- 'forward-paragraph)))
-
- -- Command: sort-lines reverse start end
- This command sorts lines in the region between start and end alphabetically.
- If reverse is non-nil, the sort is in reverse order.
-
- -- Command: sort-paragraphs reverse start end
- This command sorts paragraphs in the region between start and end
- alphabetically. If reverse is non-nil, the sort is in reverse order.
-
- -- Command: sort-pages reverse start end
- This command sorts pages in the region between start and end alphabetically.
- If reverse is non-nil, the sort is in reverse order.
-
- -- Command: sort-fields field start end
- This command sorts lines in the region between start and end, comparing them
- alphabetically by the fieldth field of each line. Fields are separated by
- whitespace and numbered starting from 1. If field is negative, sorting is by
- the -fieldth field from the end of the line. This command is useful for
- sorting tables.
-
- -- Command: sort-numeric-fields field start end
- This command sorts lines in the region between start and end, comparing them
- numerically by the fieldth field of each line. Fields are separated by
- whitespace and numbered starting from 1. The specified field must contain a
- number in each line of the region. If field is negative, sorting is by the
- -fieldth field from the end of the line. This command is useful for sorting
- tables.
-
- -- Command: sort-columns reverse &optional beg end
- This command sorts the lines in the region between beg and end, comparing them
- alphabetically by a certain range of columns. For the purpose of this command,
- the region includes the entire line that point is in and the entire line
- containing end. The column positions of beg and end bound the range of columns
- to sort on.
-
- If reverse is non-nil, the sort is in reverse order.
-
- One unusual thing about this command is that the entire line containing point,
- and the entire line containing the mark, are included in the region sorted.
-
- Note that sort-columns uses the sort utility program, and so cannot work
- properly on text containing tab characters. Use M-x untabify to convert tabs
- to spaces before sorting. The sort-columns function doesn't work in VMS,
- because the subprocess facilities are lacking.
-
-
- ΓòÉΓòÉΓòÉ 31.12. Indentation ΓòÉΓòÉΓòÉ
-
- The indentation functions are used to examine, move to, and change whitespace
- that is at the beginning of a line. Some of the functions can also change
- whitespace elsewhere on a line. Indentation always counts from zero at the
- left margin.
-
-
- ΓòÉΓòÉΓòÉ 31.12.1. Indentation Primitives ΓòÉΓòÉΓòÉ
-
- This section describes the primitive functions used to count and insert
- indentation. The functions in the following sections use these primitives.
-
- -- Function: current-indentation
- This function returns the indentation of the current line, which is the
- horizontal position of the first nonblank character. If the contents are
- entirely blank, then this is the horizontal position of the end of the line.
-
- -- Command: indent-to column &optional minimum
- This function indents from point with tabs and spaces until column is reached.
- If minimum is specified and non-nil, then at least that many spaces are
- inserted even if this requires going beyond column. The value is the column at
- which the inserted indentation ends.
-
- -- User Option: indent-tabs-mode
- If this variable is non-nil, indentation functions can insert tabs as well as
- spaces. Otherwise, they insert only spaces. Setting this variable
- automatically makes it local to the current buffer.
-
-
- ΓòÉΓòÉΓòÉ 31.12.2. Indentation Controlled by Major Mode ΓòÉΓòÉΓòÉ
-
- An important function of each major mode is to customize the TAB key to indent
- properly for the language being edited. This section describes the mechanism
- of the TAB key and how to control it. The functions in this section return
- unpredictable values.
-
- -- Variable: indent-line-function
- This variable's value is the function to be used by TAB (and various commands)
- to indent the current line. The command indent-according-to-mode does no more
- than call this function.
-
- In Lisp mode, the value is the symbol lisp-indent-line; in C mode,
- c-indent-line; in Fortran mode, fortran-indent-line. In Fundamental mode, Text
- mode, and many other modes with no standard for indentation, the value is
- indent-to-left-margin (which is the default value).
-
- -- Command: indent-according-to-mode
- This command calls the function in indent-line-function to indent the current
- line in a way appropriate for the current major mode.
-
- -- Command: indent-for-tab-command
- This command calls the function in indent-line-function to indent the current
- line, except that if that function is indent-to-left-margin, insert-tab is
- called instead.
-
- -- Variable: left-margin
- This variable is the column to which the default indent-line-function will
- indent. (That function is indent-to-left-margin.) In Fundamental mode, LFD
- indents to this column. This variable automatically becomes buffer-local when
- set in any fashion.
-
- -- Function: indent-to-left-margin
- This is the default indent-line-function, used in Fundamental mode, Text mode,
- etc. Its effect is to adjust the indentation at the beginning of the current
- line to the value specified by the variable left-margin. This may involve
- either inserting or deleting whitespace.
-
- -- Command: newline-and-indent
- This function inserts a newline, then indents the new line (the one following
- the newline just inserted) according to the major mode.
-
- Indentation is done using the current indent-line-function. In programming
- language modes, this is the same thing TAB does, but in some text modes, where
- TAB inserts a tab, newline-and-indent indents to the column specified by
- left-margin.
-
- -- Command: reindent-then-newline-and-indent
- This command reindents the current line, inserts a newline at point, and then
- reindents the new line (the one following the newline just inserted).
-
- Indentation of both lines is done according to the current major mode; this
- means that the current value of indent-line-function is called. In programming
- language modes, this is the same thing TAB does, but in some text modes, where
- TAB inserts a tab, reindent-then-newline-and-indent indents to the column
- specified by left-margin.
-
-
- ΓòÉΓòÉΓòÉ 31.12.3. Indenting an Entire Region ΓòÉΓòÉΓòÉ
-
- This section describes commands which indent all the lines in the region.
- They return unpredictable values.
-
- -- Command: indent-region start end to-column
- This command indents each nonblank line starting between start (inclusive) and
- end (exclusive). If to-column is nil, indent-region indents each nonblank line
- by calling the current mode's indentation function, the value of
- indent-line-function.
-
- If to-column is non-nil, it should be an integer specifying the number of
- columns of indentation; then this function gives each line exactly that much
- indentation, by either adding or deleting whitespace.
-
- -- Variable: indent-region-function
- The value of this variable is a function that can be used by indent-region as
- a short cut. You should design the function so that it will produce the same
- results as indenting the lines of the region one by one (but presumably
- faster).
-
- If the value is nil, there is no short cut, and indent-region actually works
- line by line.
-
- A short cut function is useful in modes such as C mode and Lisp mode, where
- the indent-line-function must scan from the beginning of the function: applying
- it to each line would be quadratic in time. The short cut can update the scan
- information as it moves through the lines indenting them; this takes linear
- time. If indenting a line individually is fast, there is no need for a short
- cut.
-
- indent-region with a non-nil argument has a different definition and does not
- use this variable.
-
- -- Command: indent-rigidly start end count
- This command indents all lines starting between start (inclusive) and end
- (exclusive) sideways by count columns. This ``preserves the shape'' of the
- affected region, moving it as a rigid unit. Consequently, this command is
- useful not only for indenting regions of unindented text, but also for
- indenting regions of formatted code.
-
- For example, if count is 3, this command adds 3 columns of indentation to each
- of the lines beginning in the region specified.
-
- In Mail mode, C-c C-y (mail-yank-original) uses indent-rigidly to indent the
- text copied from the message being replied to.
-
-
- ΓòÉΓòÉΓòÉ 31.12.4. Indentation Relative to Previous Lines ΓòÉΓòÉΓòÉ
-
- This section describes two commands which indent the current line based on the
- contents of previous lines.
-
- -- Command: indent-relative &optional unindented-ok
- This function inserts whitespace at point, extending to the same column as the
- next indent point of the previous nonblank line. An indent point is a
- non-whitespace character following whitespace. The next indent point is the
- first one at a column greater than the current column of point. For example,
- if point is underneath and to the left of the first non-blank character of a
- line of text, it moves to that column by inserting whitespace.
-
- If the previous nonblank line has no next indent point (i.e., none at a great
- enough column position), this function either does nothing (if unindented-ok is
- non-nil) or calls tab-to-tab-stop. Thus, if point is underneath and to the
- right of the last column of a short line of text, this function moves point to
- the next tab stop by inserting whitespace.
-
- This command returns an unpredictable value.
-
- In the following example, point is at the beginning of the second line:
-
- This line is indented twelve spaces.
- -!-The quick brown fox jumped over the lazy dog.
-
- Evaluation of the expression (indent-relative nil) produces the following:
-
- This line is indented twelve spaces.
- -!-The quick brown fox jumped over the lazy dog.
-
- In this example, point is between the `m' and `p' of `jumped':
-
- This line is indented twelve spaces.
- The quick brown fox jum-!-ped over the lazy dog.
-
- Evaluation of the expression (indent-relative nil) produces the following:
-
- This line is indented twelve spaces.
- The quick brown fox jum -!-ped over the lazy dog.
-
- -- Command: indent-relative-maybe
- This command indents the current line like the previous nonblank line. The
- function consists of a call to indent-relative with a non-nil value passed to
- the unindented-ok optional argument. The value is unpredictable.
-
- If the previous line has no indentation, the current line is given no
- indentation (any existing indentation is deleted); if the previous nonblank
- line has no indent points beyond the column at which point starts, nothing is
- changed.
-
-
- ΓòÉΓòÉΓòÉ 31.12.5. Adjustable ``Tab Stops'' ΓòÉΓòÉΓòÉ
-
- This section explains the mechanism for user-specified ``tab stops'' and the
- mechanisms which use and set them. The name ``tab stops'' is used because the
- feature is similar to that of the tab stops on a typewriter. The feature works
- by inserting an appropriate number of spaces and tab characters to reach the
- designated position, like the other indentation functions; it does not affect
- the display of tab characters in the buffer (see Control Char Display). Note
- that the TAB character as input uses this tab stop feature only in a few major
- modes, such as Text mode.
-
- -- Function: tab-to-tab-stop
- This function inserts spaces or tabs up to the next tab stop column defined by
- tab-stop-list. It searches the list for an element greater than the current
- column number, and uses that element as the column to indent to. If no such
- element is found, then nothing is done.
-
- -- User Option: tab-stop-list
- This variable is the list of tab stop columns used by tab-to-tab-stops. The
- elements should be integers in increasing order. The tab stop columns need not
- be evenly spaced.
-
- Use M-x edit-tab-stops to edit the location of tab stops interactively.
-
-
- ΓòÉΓòÉΓòÉ 31.12.6. Indentation-Based Motion Commands ΓòÉΓòÉΓòÉ
-
- These commands, primarily for interactive use, act based on the indentation in
- the text.
-
- -- Command: back-to-indentation
- This command moves point to the first non-whitespace character in the current
- line (which is the line in which point is located). It returns nil.
-
- -- Command: backward-to-indentation arg
- This command moves point backward arg lines and then to the first nonblank
- character on that line. It returns nil.
-
- -- Command: forward-to-indentation arg
- This command moves point forward arg lines and then to the first nonblank
- character on that line. It returns nil.
-
-
- ΓòÉΓòÉΓòÉ 31.13. Counting Columns ΓòÉΓòÉΓòÉ
-
- The column functions convert between a character position (counting characters
- from the beginning of the buffer) and a column position (counting screen
- characters from the beginning of a line).
-
- Column number computations ignore the width of the window and the amount of
- horizontal scrolling. Consequently, a column value can be arbitrarily high.
- The first (or leftmost) column is numbered 0.
-
- A character counts according to the number of columns it occupies on the
- screen. This means control characters count as occupying 2 or 4 columns,
- depending upon the value of ctl-arrow, and tabs count as occupying a number of
- columns that depends on the value of tab-width and on the column where the tab
- begins. See Control Char Display.
-
- -- Function: current-column
- This function returns the horizontal position of point, measured in columns,
- counting from 0 at the left margin. The column count is calculated by adding
- together the widths of all the displayed representations of the characters
- between the start of the current line and point.
-
- For a more complicated example of the use of current-column, see the
- description of count-lines in Text Lines.
-
- -- Function: move-to-column column
- This function moves point to column in the current line. The calculation of
- column takes into account the widths of all the displayed representations of
- the characters between the start of the line and point.
-
- If the argument column is greater than the column position of the end of the
- line, point moves to the end of the line. If column is negative, point moves
- to the beginning of the line. An error is signaled if column is not an
- integer.
-
- The return value is the column number actually moved to.
-
-
- ΓòÉΓòÉΓòÉ 31.14. Case Changes ΓòÉΓòÉΓòÉ
-
- The case change commands described here work on text in the current buffer.
- See Character Case, for case conversion commands that work on strings and
- characters.
-
- -- Command: capitalize-region start end
- This function capitalizes all words in the region defined by start and end.
- To capitalize means to convert each word's first character to upper case and
- convert the rest of each word to lower case. The function returns nil.
-
- If one end of the region is in the middle of a word, the part of the word
- within the region is treated as an entire word.
-
- When capitalize-region is called interactively, start and end are point and
- the mark, with the smallest first.
-
- ---------- Buffer: foo ----------
- This is the contents of the 5th foo.
- ---------- Buffer: foo ----------
-
- (capitalize-region 1 44)
- => nil
-
- ---------- Buffer: foo ----------
- This Is The Contents Of The 5th Foo.
- ---------- Buffer: foo ----------
-
- -- Command: downcase-region start end
- This function converts all of the letters in the region defined by start and
- end to lower case. The function returns nil.
-
- When downcase-region is called interactively, start and end are point and the
- mark, with the smallest first.
-
- -- Command: upcase-region start end
- This function converts all of the letters in the region defined by start and
- end to upper case. The function returns nil.
-
- When upcase-region is called interactively, start and end are point and the
- mark, with the smallest first.
-
- -- Command: capitalize-word count
- This function capitalizes count words after point, moving point over as it
- does. To capitalize means to convert each word's first character to upper case
- and convert the rest of each word to lower case. If count is negative, the
- function capitalizes the -count previous words but does not move point. The
- value is nil.
-
- If point is in the middle of a word, the part of word the before point (if
- moving forward) or after point (if operating backward) is ignored. The rest is
- treated as an entire word.
-
- When capitalize-word is called interactively, count is set to the numeric
- prefix argument.
-
- -- Command: downcase-word count
- This function converts the count words after point to all lower case, moving
- point over as it does. If count is negative, it converts the -count previous
- words but does not move point. The value is nil.
-
- When downcase-word is called interactively, count is set to the numeric prefix
- argument.
-
- -- Command: upcase-word count
- This function converts the count words after point to all upper case, moving
- point over as it does. If count is negative, it converts the -count previous
- words but does not move point. The value is nil.
-
- When upcase-word is called interactively, count is set to the numeric prefix
- argument.
-
-
- ΓòÉΓòÉΓòÉ 31.15. Substituting for a Character Code ΓòÉΓòÉΓòÉ
-
- The following function replaces characters within a specified region based on
- their character code.
-
- -- Function: subst-char-in-region start end old-char new-char &optional noundo
- This function replaces all occurrences of the character old-char with the
- character new-char in the region of the current buffer defined by start and
- end.
-
- If noundo is non-nil, then subst-char-in-region does not record the change for
- undo and does not mark the buffer as modified. This feature is useful for
- changes which are not considered significant, such as when Outline mode changes
- visible lines to invisible lines and vice versa.
-
- subst-char-in-region does not move point and returns nil.
-
- ---------- Buffer: foo ----------
- This is the contents of the buffer before.
- ---------- Buffer: foo ----------
-
- (subst-char-in-region 1 20 ?i ?X)
- => nil
-
- ---------- Buffer: foo ----------
- ThXs Xs the contents of the buffer before.
- ---------- Buffer: foo ----------
-
-
- ΓòÉΓòÉΓòÉ 31.16. Underlining ΓòÉΓòÉΓòÉ
-
- The underlining commands are somewhat obsolete. The underline-region function
- actually inserts `_^H' before each appropriate character in the region. This
- command provides a minimal text formatting feature that might work on your
- printer; however, we recommend instead that you use more powerful text
- formatting facilities, such as Texinfo.
-
- -- Command: underline-region start end
- This function underlines all nonblank characters in the region defined by
- start and end. That is, an underscore character and a backspace character are
- inserted just before each non-whitespace character in the region. The
- backspace characters are intended to cause overstriking, but in Emacs they
- display as either `\010' or `^H', depending on the setting of ctl-arrow. There
- is no way to see the effect of the overstriking within Emacs. The value is
- nil.
-
- -- Command: ununderline-region start end
- This function removes all underlining (overstruck underscores) in the region
- defined by start and end. The value is nil.
-
-
- ΓòÉΓòÉΓòÉ 31.17. Registers ΓòÉΓòÉΓòÉ
-
- A register is a sort of variable used in Emacs editing that can hold a marker,
- a string, or a rectangle. Each register is named by a single character. All
- characters, including control and meta characters (but with the exception of
- C-g), can be used to name registers. Thus, there are 255 possible registers.
- A register is designated in Emacs Lisp by a character which is its name.
-
- The functions in this section return unpredictable values unless otherwise
- stated.
-
- -- Variable: register-alist
- This variable is an alist of elements of the form (name . contents).
- Normally, there is one element for each Emacs register that has been used.
-
- The object name is a character (an integer) identifying the register. The
- object contents is a string, marker, or list representing the register
- contents. A string represents text stored in the register. A marker
- represents a position. A list represents a rectangle; its elements are
- strings, one per line of the rectangle.
-
- -- Command: view-register reg
- This command displays what is contained in register reg.
-
- -- Function: get-register reg
- This function returns the contents of the register reg, or nil if it has no
- contents.
-
- -- Function: set-register reg value
- This function sets the contents of register reg to value. A register can be
- set to any value, but the other register functions expect only strings,
- markers, and lists.
-
- -- Command: point-to-register reg
- This command stores both the current location of point and the current buffer
- in register reg as a marker.
-
- -- Command: register-to-point reg
- This command moves point to the position stored in register reg. Since both
- the buffer and the location within the buffer are stored by the
- point-to-register function, this command can switch you to another buffer.
-
- If the register does not contain a saved position (a marker), then an error is
- signaled.
-
- -- Command: insert-register reg &optional beforep
- This command inserts contents of register reg into the current buffer.
-
- Normally, this command puts point before the inserted text, and the mark after
- it. However, if the optional second argument beforep is non-nil, it puts the
- mark before and point after. You can pass a non-nil second argument beforep to
- this function interactively by supplying any prefix argument.
-
- If the register contains a rectangle, then the rectangle is inserted with its
- upper left corner at point. This means that text is inserted in the current
- line and underneath it on successive lines.
-
- If the register contains something other than saved text (a string) or a
- rectangle (a list), currently useless things happen. This may be changed in
- the future.
-
- -- Command: copy-to-register reg start end &optional delete-flag
- This command copies the region from start to end into register reg. If
- delete-flag is non-nil, it deletes the region from the buffer after copying it
- into the register.
-
- -- Command: prepend-to-register reg start end &optional delete-flag
- This command prepends the region from start to end into register reg. If
- delete-flag is non-nil, it deletes the region from the buffer after copying it
- to the register.
-
- -- Command: append-to-register reg start end &optional delete-flag
- This command appends the region from start to end to the text already in
- register reg. If delete-flag is non-nil, it deletes the region from the buffer
- after copying it to the register.
-
- -- Command: copy-rectangle-to-register reg start end &optional delete-flag
- This command copies a rectangular region from start to end into register reg.
- If delete-flag is non-nil, it deletes the region from the buffer after copying
- it to the register.
-
-
- ΓòÉΓòÉΓòÉ 32. Searching and Matching ΓòÉΓòÉΓòÉ
-
- GNU Emacs provides two ways to search through a buffer for specified text:
- exact string searches and regular expression searches. After a regular
- expression search, you can identify the text matched by parts of the regular
- expression by examining the match data.
-
-
- ΓòÉΓòÉΓòÉ 32.1. Searching for Strings ΓòÉΓòÉΓòÉ
-
- These are the primitive functions for searching through the text in a buffer.
- They are meant for use in programs, but you may call them interactively. If
- you do so, they prompt for the search string; limit and noerror are set to nil,
- and repeat is set to 1.
-
- -- Command: search-forward string &optional limit noerror repeat
- This function searches forward from point for an exact match for string. It
- sets point to the end of the occurrence found, and returns t. If no match is
- found, the value and side effects depend on noerror.
-
- In the following example, point is positioned at the beginning of the line.
- Then (search-forward "fox") is evaluated in the minibuffer and point is left
- after the last letter of `fox':
-
- ---------- Buffer: foo ----------
- -!-The quick brown fox jumped over the lazy dog.
- ---------- Buffer: foo ----------
-
- (search-forward "fox")
- => t
-
- ---------- Buffer: foo ----------
- The quick brown fox-!- jumped over the lazy dog.
- ---------- Buffer: foo ----------
-
- If limit is non-nil, then it is the upper bound to the search. (It must be a
- position in the current buffer.) No match extending after that position is
- accepted.
-
- What happens when the search fails depends on the value of noerror. If
- noerror is nil, a search-failed error is signaled. If noerror is t,
- search-forward returns nil and doesn't signal an error. If noerror is neither
- nil nor t, then search-forward moves point to limit and returns nil.
-
- If repeat is non-nil, then the search is repeated that many times. Point is
- positioned at the end of the last match.
-
- -- Command: search-backward string &optional limit noerror repeat
- This function searches backward from point for string. It is just like
- search-forward except that it searches backwards and leaves point at the
- beginning of the match.
-
- -- Command: word-search-forward string &optional limit noerror repeat
- This function searches forward from point for a ``word'' match for string. It
- sets point to the end of the occurrence found, and returns t.
-
- A word search differs from a simple string search in that a word search
- *requires* that the words it searches for are present as entire words
- (searching for the word `ball' will not match the word `balls'), and
- punctuation and spacing are ignored (searching for `ball boy' will match `ball.
- Boy!').
-
- In this example, point is first placed at the beginning of the buffer; the
- search leaves it between the y and the !.
-
- ---------- Buffer: foo ----------
- -!-He said "Please! Find
- the ball boy!"
- ---------- Buffer: foo ----------
-
- (word-search-forward "Please find the ball, boy.")
- => t
-
- ---------- Buffer: foo ----------
- He said "Please! Find
- the ball boy-!-!"
- ---------- Buffer: foo ----------
-
- If limit is non-nil (it must be a position in the current buffer), then it is
- the upper bound to the search. The match found must not extend after that
- position.
-
- If noerror is t, then word-search-forward returns nil when a search fails,
- instead of signaling an error. If noerror is neither nil nor t, then
- word-search-forward moves point to limit and returns nil.
-
- If repeat is non-nil, then the search is repeated that many times. Point is
- positioned at the end of the last match.
-
- -- Command: word-search-backward string &optional limit noerror repeat
- This function searches backward from point for a word match to string. This
- function is just like word-search-forward except that it searches backward and
- normally leaves point at the beginning of the match.
-
-
- ΓòÉΓòÉΓòÉ 32.2. Regular Expressions ΓòÉΓòÉΓòÉ
-
- A regular expression (regexp, for short) is a pattern that denotes a (possibly
- infinite) set of strings. Searching for matches for a regexp is a very
- powerful operation. This section explains how to write regexps; the following
- section says how to search for them.
-
-
- ΓòÉΓòÉΓòÉ 32.2.1. Syntax of Regular Expressions ΓòÉΓòÉΓòÉ
-
- Regular expressions have a syntax in which a few characters are special
- constructs and the rest are ordinary. An ordinary character is a simple
- regular expression which matches that character and nothing else. The special
- characters are `$', `^', `.', `*', `+', `?', `[', `]' and `\'; no new special
- characters will be defined in the future. Any other character appearing in a
- regular expression is ordinary, unless a `\' precedes it.
-
- For example, `f' is not a special character, so it is ordinary, and therefore
- `f' is a regular expression that matches the string `f' and no other string.
- (It does not match the string `ff'.) Likewise, `o' is a regular expression
- that matches only `o'.
-
- Any two regular expressions a and b can be concatenated. The result is a
- regular expression which matches a string if a matches some amount of the
- beginning of that string and b matches the rest of the string.
-
- As a simple example, we can concatenate the regular expressions `f' and `o' to
- get the regular expression `fo', which matches only the string `fo'. Still
- trivial. To do something more powerful, you need to use one of the special
- characters. Here is a list of them:
-
- . (Period)
- is a special character that matches any single character except a
- newline. Using concatenation, we can make regular expressions like
- `a.b' which matches any three-character string which begins with `a'
- and ends with `b'.
-
- *
- is not a construct by itself; it is a suffix that means the preceding
- regular expression is to be repeated as many times as possible. In
- `fo*', the `*' applies to the `o', so `fo*' matches one `f' followed
- by any number of `o's. The case of zero `o's is allowed: `fo*' does
- match `f'.
-
- `*' always applies to the smallest possible preceding expression.
- Thus, `fo*' has a repeating `o', not a repeating `fo'.
-
- The matcher processes a `*' construct by matching, immediately, as
- many repetitions as can be found. Then it continues with the rest of
- the pattern. If that fails, backtracking occurs, discarding some of
- the matches of the `*'-modified construct in case that makes it
- possible to match the rest of the pattern. For example, matching
- `ca*ar' against the string `caaar', the `a*' first tries to match all
- three `a's; but the rest of the pattern is `ar' and there is only `r'
- left to match, so this try fails. The next alternative is for `a*' to
- match only two `a's. With this choice, the rest of the regexp matches
- successfully.
-
- +
- is a suffix character similar to `*' except that it must match the
- preceding expression at least once. So, for example, `ca+r' will
- match the strings `car' and `caaaar' but not the string `cr', whereas
- `ca*r' would match all three strings.
-
- ?
- is a suffix character similar to `*' except that it can match the
- preceding expression either once or not at all. For example, `ca?r'
- will match `car' or `cr'; nothing else.
-
- [ ... ]
- `[' begins a character set, which is terminated by a `]'. In the
- simplest case, the characters between the two form the set. Thus,
- `[ad]' matches either one `a' or one `d', and `[ad]*' matches any
- string composed of just `a's and `d's (including the empty string),
- from which it follows that `c[ad]*r' matches `cr', `car', `cdr',
- `caddaar', etc.
-
- Character ranges can also be included in a character set, by writing
- two characters with a `-' between them. Thus, `[a-z]' matches any
- lower case letter. Ranges may be intermixed freely with individual
- characters, as in `[a-z$%.]', which matches any lower case letter or
- `$', `%' or a period.
-
- Note that the usual special characters are not special any more
- inside a character set. A completely different set of special
- characters exists inside character sets: `]', `-' and `^'.
-
- To include a `]' in a character set, make it the first character. For
- example, `[]a]' matches `]' or `a'. To include a `-', write `---',
- which is a range containing only `-', or write `-' as the first
- character in the range.
-
- To include `^', make it other than the first character in the set.
-
- [^ ... ]
- `[^' begins a complement character set, which matches any character
- except the ones specified. Thus, `[^a-z0-9A-Z]' matches all
- characters except letters and digits.
-
- `^' is not special in a character set unless it is the first
- character. The character following the `^' is treated as if it were
- first (thus, `-' and `]' are not special there).
-
- Note that a complement character set can match a newline, unless
- newline is mentioned as one of the characters not to match.
-
- ^
- is a special character that matches the empty string, but only at the
- beginning of a line in the text being matched. Otherwise it fails to
- match anything. Thus, `^foo' matches a `foo' which occurs at the
- beginning of a line.
-
- When matching a string, `^' matches at the beginning of the string or
- after a newline character `\n'.
-
- $
- is similar to `^' but matches only at the end of a line. Thus, `x+$'
- matches a string of one `x' or more at the end of a line.
-
- When matching a string, `$' matches at the end of the string or
- before a newline character `\n'.
-
- \
- has two functions: it quotes the special characters (including `\'),
- and it introduces additional special constructs.
-
- Because `\' quotes special characters, `\$' is a regular expression
- which matches only `$', and `\[' is a regular expression which
- matches only `[', and so on.
-
- Note that `\' also has special meaning in the read syntax of Lisp
- strings (see String Type), and must be quoted with `\'. For example,
- the regular expression that matches the `\' character is `\\'. To
- write a Lisp string that contains `\\', Lisp syntax requires you to
- quote each `\' with another `\'. Therefore, the read syntax for this
- string is "\\\\".
-
- *Note:* for historical compatibility, special characters are treated as
- ordinary ones if they are in contexts where their special meanings make no
- sense. For example, `*foo' treats `*' as ordinary since there is no preceding
- expression on which the `*' can act. It is poor practice to depend on this
- behavior; better to quote the special character anyway, regardless of where it
- appears.
-
- For the most part, `\' followed by any character matches only that character.
- However, there are several exceptions: characters which, when preceded by `\',
- are special constructs. Such characters are always ordinary when encountered
- on their own. Here is a table of `\' constructs:
-
- \|
- specifies an alternative. Two regular expressions a and b with `\|'
- in between form an expression that matches anything that either a or
- b matches.
-
- Thus, `foo\|bar' matches either `foo' or `bar' but no other string.
-
- `\|' applies to the largest possible surrounding expressions. Only a
- surrounding `\( ... \)' grouping can limit the grouping power of
- `\|'.
-
- Full backtracking capability exists to handle multiple uses of `\|'.
-
- \( ... \)
- is a grouping construct that serves three purposes:
-
- 1. To enclose a set of `\|' alternatives for other operations. Thus,
- `\(foo\|bar\)x' matches either `foox' or `barx'.
-
- 2. To enclose a complicated expression for a suffix character such as `*'
- to operate on. Thus, `ba\(na\)*' matches `bananana', etc., with any
- (zero or more) number of `na' strings.
-
- 3. To record a matched substring for future reference.
-
- This last application is not a consequence of the idea of a
- parenthetical grouping; it is a separate feature which happens to be
- assigned as a second meaning to the same `\( ... \)' construct
- because there is no conflict in practice between the two meanings.
- Here is an explanation of this feature:
-
- \digit
- after the end of a `\( ... \)' construct, the matcher remembers the
- beginning and end of the text matched by that construct. Then, later
- on in the regular expression, you can use `\' followed by digit to
- mean ``match the same text matched the digitth time by the `\( ...
- \)' construct.''
-
- The strings matching the first nine `\( ... \)' constructs appearing
- in a regular expression are assigned numbers 1 through 9 in the order
- that the open parentheses appear in the regular expression. `\1'
- through `\9' can be used to refer to the text matched by the
- corresponding `\( ... \)' construct.
-
- For example, `\(.*\)\1' matches any newline-free string that is
- composed of two identical halves. The `\(.*\)' matches the first
- half, which may be anything, but the `\1' that follows must match the
- same exact text.
-
- \`
- matches the empty string, provided it is at the beginning of the
- buffer.
-
- \'
- matches the empty string, provided it is at the end of the buffer.
-
- \b
- matches the empty string, provided it is at the beginning or end of a
- word. Thus, `\bfoo\b' matches any occurrence of `foo' as a separate
- word. `\bballs?\b' matches `ball' or `balls' as a separate word.
-
- \B
- matches the empty string, provided it is not at the beginning or end
- of a word.
-
- \<
- matches the empty string, provided it is at the beginning of a word.
-
- \>
- matches the empty string, provided it is at the end of a word.
-
- \w
- matches any word-constituent character. The editor syntax table
- determines which characters these are. See Syntax Tables.
-
- \W
- matches any character that is not a word-constituent.
-
- \scode
- matches any character whose syntax is code. Here code is a character
- which represents a syntax code: thus, `w' for word constituent, `-'
- for whitespace, `(' for open parenthesis, etc. See Syntax Tables,
- for a list of the codes.
-
- \Scode
- matches any character whose syntax is not code.
-
- Not every string is a valid regular expression. For example, any string with
- unbalanced square brackets is invalid, and so is a string that ends with a
- single `\'. If an invalid regular expression is passed to any of the search
- functions, an invalid-regexp error is signaled.
-
- -- Function: regexp-quote string
- This function returns a regular expression string which matches exactly string
- and nothing else. This allows you to request an exact string match when
- calling a function that wants a regular expression.
-
- (regexp-quote "^The cat$")
- => "\\^The cat\\$"
-
- One use of regexp-quote is to combine an exact string match with context
- described as a regular expression. For example, this searches for the string
- which is the value of string, surrounded by whitespace:
-
- (re-search-forward (concat "\\s " (regexp-quote string) "\\s "))
-
-
- ΓòÉΓòÉΓòÉ 32.2.2. Complex Regexp Example ΓòÉΓòÉΓòÉ
-
- Here is a complicated regexp, used by Emacs to recognize the end of a sentence
- together with any whitespace that follows. It is the value of the variable
- sentence-end.
-
- First, we show the regexp as a string in Lisp syntax to enable you to
- distinguish the spaces from the tab characters. The string constant begins and
- ends with a double-quote. `\"' stands for a double-quote as part of the
- string, `\\' for a backslash as part of the string, `\t' for a tab and `\n' for
- a newline.
-
- "[.?!][]\"')}]*\\($\\|\t\\| \\)[ \t\n]*"
-
- In contrast, if you evaluate the variable sentence-end, you will see the
- following:
-
- sentence-end
- =>
- "[.?!][]\"')}]*\\($\\| \\| \\)[
- ]*"
-
- In this case, the tab and carriage return are the actual characters.
-
- This regular expression contains four parts in succession and can be
- deciphered as follows:
-
- [.?!]
- The first part of the pattern consists of three characters, a period,
- a question mark and an exclamation mark, within square brackets. The
- match must begin with one of these three characters.
-
- []\"')}]*
- The second part of the pattern matches any closing braces and
- quotation marks, zero or more of them, that may follow the period,
- question mark or exclamation mark. The \" is Lisp syntax for a
- double-quote in a string. The `*' at the end indicates that the
- immediately preceding regular expression (a character set, in this
- case) may be repeated zero or more times.
-
- \\($\\|\t\\|@ @ \\)
- The third part of the pattern matches the whitespace that follows the
- end of a sentence: the end of a line, or a tab, or two spaces. The
- double backslashes are needed to prevent Emacs from reading the
- parentheses and vertical bars as part of the search pattern; the
- parentheses are used to mark the group and the vertical bars are used
- to indicated that the patterns to either side of them are
- alternatives. The dollar sign is used to match the end of a line.
- The tab character is written using `\t' and the two spaces are
- written as themselves.
-
- [ \t\n]*
- Finally, the last part of the pattern indicates that the end of the
- line or the whitespace following the period, question mark or
- exclamation mark may, but need not, be followed by additional
- whitespace.
-
-
- ΓòÉΓòÉΓòÉ 32.3. Regular Expression Searching ΓòÉΓòÉΓòÉ
-
- In GNU Emacs, you can search for the next match for a regexp either
- incrementally or not. Incremental search commands are described in the The GNU
- Emacs Manual. See Regular Expression Search. Here we describe only the search
- functions useful in programs. The principal is re-search-forward.
-
- -- Command: re-search-forward regexp &optional limit noerror repeat
- This function searches forward in the current buffer for a string of text that
- is matched by the regular expression regexp. The function skips over any
- amount of text that is not matched by regexp, and leaves point at the end of
- the first string found that does match.
-
- If the search is successful (i.e., if text matching regexp is found), then
- point is left at the end of that text, and the function returns t.
-
- What happens when the search fails depends on the value of noerror. If
- noerror is nil, a search-failed error is signaled. If noerror is t,
- re-search-forward returns nil and doesn't signal an error. If noerror is
- neither nil nor t, then search-forward moves point to limit and returns nil.
-
- If limit is non-nil (it must be a position in the current buffer), then it is
- the upper bound to the search. No match extending after that position is
- accepted.
-
- If repeat is supplied (it must be a positive number), then the search is
- repeated that many times (each time starting at the end of the previous time's
- match). The call succeeds if all these searches succeeded, and point is left
- at the end of the match found by the last search. Otherwise the search fails.
-
- In the following example, point is initially located directly before the `T'.
- After evaluating the form, point is located at the end of that line (between
- the `t' of `hat' and before the newline).
-
- ---------- Buffer: foo ----------
- I read "-!-The cat in the hat
- comes back" twice.
- ---------- Buffer: foo ----------
-
- (re-search-forward "[a-z]+" nil t 5)
- => t
-
- ---------- Buffer: foo ----------
- I read "The cat in the hat-!-
- comes back" twice.
- ---------- Buffer: foo ----------
-
- -- Command: re-search-backward regexp &optional limit noerror repeat
- This function searches backward in the current buffer for a string of text
- that is matched by the regular expression regexp, leaving point at the
- beginning of the first text found.
-
- This function is analogous to re-search-forward, but they are not simple
- mirror images. re-search-forward finds the match whose beginning is as close
- as possible. If re-search-backward were a perfect mirror image, it would find
- the match whose end is as close as possible. However, in fact it finds the
- match whose beginning is as close as possible. The reason is that matching a
- regular expression at a given spot always works from beginning to end, and is
- done at a specified beginning position. Thus, true mirror-image behavior would
- require a special feature for matching regexps from end to beginning.
-
- -- Function: string-match regexp string &optional start
- This function returns the index of the start of the first match for the
- regular expression regexp in string, or nil if there is no match. If start is
- non-nil, the search starts at that index in string.
-
- For example,
-
- (string-match "quick" "The quick brown fox jumped quickly.")
- => 4
- (string-match "quick" "The quick brown fox jumped quickly." 8)
- => 27
-
- The index of the first character of the string is 0, the index of the second
- character is 1, and so on.
-
- After this function returns, the index of the first character beyond the match
- is available as (match-end 0). See Match Data.
-
- (string-match "quick" "The quick brown fox jumped quickly." 8)
- => 27
-
- (match-end 0)
- => 32
-
- The match-end function is described along with match-beginning; see Match
- Data.
-
- -- Function: looking-at regexp
- This function determines whether the text in the current buffer directly
- following point matches the regular expression regexp. ``Directly following''
- means precisely that: the search is ``anchored'' and it must succeed starting
- with the first character following point. The result is t if so, nil
- otherwise.
-
- Point is not moved, but the match data is updated and can be used with
- match-beginning or match-end. See Match Data.
-
- In this example, point is located directly before the `T'. If it were
- anywhere else, the result would be nil.
-
- ---------- Buffer: foo ----------
- I read "-!-The cat in the hat
- comes back" twice.
- ---------- Buffer: foo ----------
- (looking-at "The cat in the hat$")
- => t
-
-
- ΓòÉΓòÉΓòÉ 32.4. The Match Data ΓòÉΓòÉΓòÉ
-
- Emacs keeps track of the positions of the start and end of segments of text
- found during a regular expression search. This means, for example, that you
- can search for a complex pattern, such as a date in an Rmail message, and
- extract parts of it.
-
- -- Function: match-beginning count
- This function returns the position of the start of text matched by the last
- regular expression searched for. count, a number, specifies a subexpression
- whose start position is the value. If count is zero, then the value is the
- position of the text matched by the whole regexp. If count is greater than
- zero, then the value is the position of the beginning of the text matched by
- the countth subexpression, regardless of whether it was used in the final
- match.
-
- Subexpressions of a regular expression are those expressions grouped inside of
- parentheses, `\(...\)'. The countth subexpression is found by counting
- occurrences of `\(' from the beginning of the whole regular expression. The
- first subexpression is numbered 1, the second 2, and so on.
-
- The match-end function is similar to the match-beginning function except that
- it returns the position of the end of the matched text.
-
- Here is an example, with a comment showing the numbers of the positions in the
- text:
-
- (string-match "\\(qu\\)\\(ick\\)" "The quick fox jumped quickly.")
- => 4 ;^^^^^^^^^^
- ;0123456789
-
- (match-beginning 1) ; The beginning of the match
- => 4 ; with `qu' is at index 4.
-
- (match-beginning 2) ; The beginning of the match
- => 6 ; with `ick' is at index 6.
-
- (match-end 1) ; The end of the match
- => 6 ; with `qu' is at index 6.
-
- (match-end 2) ; The end of the match
- => 9 ; with `ick' is at index 9.
-
- Here is another example. Before the form is evaluated, point is located at the
- beginning of the line. After evaluating the search form, point is located on
- the line between the space and the word `in'. The beginning of the entire
- match is at the 9th character of the buffer (`T'), and the beginning of the
- match for the first subexpression is at the 13th character (`c').
-
- (list
- (re-search-forward "The \\(cat \\)")
- (match-beginning 0)
- (match-beginning 1))
- => (t 9 13)
-
- ---------- Buffer: foo ----------
- I read "The cat -!-in the hat comes back" twice.
- ^ ^
- 9 13
- ---------- Buffer: foo ----------
-
- (Note that in this case, the index returned is a buffer position; the first
- character of the buffer counts as 1.)
-
- It is essential that match-beginning be called after the search desired, but
- before any other searches are performed. match-beginning may not give the
- desired results if any other Lisp programs are executed between the search and
- it, since they may do other searches. This example shows misuse of
- match-beginning.
-
- (re-search-forward "The \\(cat \\)")
- => t
- (foo) ; Perhaps foo does more regexp searching.
- (match-beginning 0)
- => 61 ; Unexpected result!
-
- See the discussion of store-match-data for an example of how to save and
- restore the match data around a search.
-
- -- Function: match-end count
- This function returns the position of the end of text matched by the last
- regular expression searched for. This function is otherwise similar to
- match-beginning.
-
- -- Function: replace-match replacement &optional fixedcase literal
- This function replaces the text matched by the last search with replacement.
-
- If fixedcase is non-nil, then the case of the replacement text is not changed;
- otherwise, the replacement text is converted to a different case depending upon
- the capitalization of the text to be replaced. If the original text is all
- upper case, the replacement text is converted to upper case, except when all of
- the words in the original text are only one character long. In that event, the
- replacement text is capitalized. If all of the words in the original text are
- capitalized, then all of the words in the replacement text are capitalized.
-
- If literal is non-nil, then replacement is inserted exactly as it is, the only
- alterations being case changes as needed. If it is nil (the default), then the
- character `\' is treated specially. If a `\' appears in replacement, then it
- must be part of one of the following sequences:
-
- `\&'
- `\&' stands for the entire text being replaced.
-
- `\n'
- `\n' stands for the nth subexpression in the original regexp.
- Subexpressions are those expressions grouped inside of `\(...\)'. n
- is a digit.
-
- `\\'
- `\\' stands for a single `\' in the replacement text.
-
- replace-match leaves point at the end of the replacement text, and returns t.
-
-
- ΓòÉΓòÉΓòÉ 32.5. Saving and Restoring the Match Data ΓòÉΓòÉΓòÉ
-
- -- Function: match-data
- This function returns a new list containing all the information on what text
- the last search matched. Element zero is the position of the beginning of the
- match for the whole expression; element one is the position of the end of the
- match for the expression. The next two elements are the positions of the
- beginning and end of the match for the first subexpression. In general,
- element number 2n corresponds to (match-beginning n); and element number 2n + 1
- corresponds to (match-end n).
-
- All the elements are markers, or the integer 0 for a match at the beginning of
- a string (with string-match), or nil if there was no match for that
- subexpression. As with other functions that get information about a search,
- there must be no possibility of intervening searches between the call to a
- search function and the call to match-data that is intended to save the
- match-data for that search.
-
- (match-data)
- => (#<marker at 9 in foo> #<marker at 17 in foo>
- #<marker at 13 in foo> #<marker at 17 in foo>)
-
- In version 19, all elements will be markers or nil if matching was done on a
- buffer, and all will be integers or nil if matching was done on a string with
- string-match.
-
- -- Function: store-match-data match-list
- This function sets the match data within Emacs Lisp from the elements of
- match-list, which should be a list created by a previous call to match-data.
-
- store-match-data may be used together with match-data to perform a search
- without changing the match-data. This is useful when such searches occur in
- subroutines whose callers may not expect searches to go on. Here is how:
-
- (let ((data (match-data)))
- (unwind-protect
- ... ; May change the original match data.
- (store-match-data data)))
-
- All asynchronous process functions (filters and sentinels) and some modes that
- use recursive-edit should save and restore the match data if they do a search
- or if they let the user type arbitrary commands.
-
- Here is a function which will restore the match data if the buffer associated
- with it still exists.
-
- (defun restore-match-data (data)
- "Restore the match data DATA unless the buffer is missing."
- (catch 'foo
- (let ((d data))
- (while d
- (and (car d)
- (null (marker-buffer (car d)))
- ;; match-data buffer is deleted.
- (throw 'foo nil))
- (setq d (cdr d)))
- (store-match-data data))))
-
-
- ΓòÉΓòÉΓòÉ 32.6. Standard Regular Expressions Used in Editing ΓòÉΓòÉΓòÉ
-
- -- Variable: page-delimiter
- This is the regexp describing line-beginnings that separate pages. The default
- value is "^\014" (i.e., "^^L" or "^\C-l").
-
- -- Variable: paragraph-separate
- This is the regular expression for recognizing the beginning of a line that
- separates paragraphs. (If you change this, you may have to change
- paragraph-start also.) The default value is "^[ \t\f]*$", which is a line that
- consists entirely of spaces, tabs, and form feeds.
-
- -- Variable: paragraph-start
- This is the regular expression for recognizing the beginning of a line that
- starts or separates paragraphs. The default value is "^[ \t\n\f]", which
- matches a line starting with a space, tab, newline, or form feed.
-
- -- Variable: sentence-end
- This is the regular expression describing the end of a sentence. (All
- paragraph boundaries also end sentences, regardless.) The default value is:
-
- "[.?!][]\"')}]*\\($\\|\t\\| \\)[ \t\n]*"
-
- This means a period, question mark or exclamation mark, followed by a closing
- brace, followed by tabs, spaces or new lines.
-
- For a detailed explanation of this regular expression, see Regexp Example.
-
-
- ΓòÉΓòÉΓòÉ 32.7. Searching and Case ΓòÉΓòÉΓòÉ
-
- By default, searches in Emacs ignore the case of the text they are searching
- through; if you specify searching for `FOO', then `Foo' or `foo' is also
- considered a match. Regexps, and in particular character sets, are included:
- thus, `[aB]' would match `a' or `A' or `b' or `B'.
-
- If you do not want this feature, set the variable case-fold-search to nil.
- Then all letters must match exactly, including case. This is a
- per-buffer-local variable; altering the variable affects only the current
- buffer. ( See Intro to Buffer-Local.) Alternatively, you may change the value
- of default-case-fold-search, which is the default value of case-fold-search for
- buffers that do not override it.
-
- -- User Option: case-replace
- This variable determines whether query-replace should preserve case in
- replacements. If the variable is nil, then case need not be preserved.
-
- -- User Option: case-fold-search
- This buffer-local variable determines whether searches should ignore case. If
- the variable is nil they do not ignore case; otherwise they do ignore case.
-
- -- Variable: default-case-fold-search
- The value of this variable is the default value for case-fold-search in
- buffers that do not override it. This is the same as (default-value
- 'case-fold-search).
-
-
- ΓòÉΓòÉΓòÉ 33. Syntax Tables ΓòÉΓòÉΓòÉ
-
- A syntax table provides Emacs with the information that determines the
- syntactic use of each character in a buffer. This information is used by the
- parsing commands, the complex movement commands, and others to determine where
- words, symbols, and other syntactic constructs begin and end.
-
- A syntax table is a vector of 256 elements; it contains one entry for each of
- the 256 ASCII characters of an 8-bit byte. Each element is an integer that
- encodes the syntax of the character in question.
-
- Syntax tables are used only for moving across text, not for the GNU Emacs Lisp
- reader. GNU Emacs Lisp uses built-in syntactic rules when reading Lisp
- expressions, and these rules cannot be changed.
-
- Each buffer has its own major mode, and each major mode has its own idea of
- the syntactic class of various characters. For example, in Lisp mode, the
- character `;' begins a comment, but in C mode, it terminates a statement. To
- support these variations, Emacs makes the choice of syntax table local to the
- each buffer. Typically, each major mode has its own syntax table and installs
- that table in each buffer which uses that mode. Changing this table alters the
- syntax in all those buffers as well as in any buffers subsequently put in that
- mode. Occasionally several similar modes share one syntax table. See Example
- Major Modes, for an example of how to set up a syntax table.
-
- -- Function: syntax-table-p object
- This function returns t if object is a vector of length 256 elements. This
- means that the vector may be a syntax table. However, according to this test,
- any vector of length 256 is considered to be a syntax table, no matter what its
- contents.
-
-
- ΓòÉΓòÉΓòÉ 33.1. Syntax Descriptors ΓòÉΓòÉΓòÉ
-
- This section describes the syntax classes and flags that denote the syntax of
- a character, and how they are represented as a syntax descriptor, which is a
- Lisp string that you pass to modify-syntax-entry to specify the desired syntax.
-
- Emacs defines twelve syntax classes. Each syntax table contains a mapping
- that puts each character into one class. There is no necessary relationship
- between the class of a character in one syntax table and its class in any other
- table.
-
- Each class is designated by a mnemonic character which serves as the name of
- the class when you need to specify a class. Usually the designator character
- is one which is frequently put in that class; however, its meaning as a
- designator is unvarying and independent of how it is actually classified.
-
- A syntax descriptor is a Lisp string which specifies a syntax class, a
- matching character (unused except for parenthesis classes) and flags. The first
- character is the designator for a syntax class. The second character is the
- character to match; if it is unused, put a space there. Then come the
- characters for any desired flags. If no matching character or flags are
- needed, one character is sufficient.
-
- Thus, the descriptor for the character `*' in C mode is `. 23' (i.e.,
- punctuation, matching character slot unused, second character of a
- comment-starter, first character of an comment-ender), and the entry for `/' is
- `. 14' (i.e., punctuation, matching character slot unused, first character of a
- comment-starter, second character of a comment-ender).
-
-
- ΓòÉΓòÉΓòÉ 33.1.1. Table of Syntax Classes ΓòÉΓòÉΓòÉ
-
- Here is a summary of the classes, the characters that stand for them, their
- meanings, and examples of their use.
-
- -- Syntax class: whitespace character
- Whitespace characters (designated with `@ ' or `-') separate symbols and words
- from each other. Typically, whitespace characters have no other syntactic use,
- and multiple whitespace characters are syntactically equivalent to one. Space,
- tab, newline and formfeed are almost always considered whitespace.
-
- -- Syntax class: word constituent
- Word constituents (designated with `w') are parts of normal English words and
- are typically used in variable and command names in programs. All upper and
- lower case letters and the digits are typically word constituents.
-
- -- Syntax class: symbol constituent
- Symbol constituents (designated with `_') are the extra characters that are
- used in variable and command names along with word constituents. For example,
- the symbol constituents class is used in Lisp mode to indicate that certain
- characters may be part of symbol names even though they are not part of English
- words. These characters are `$&*+-_<>'. In standard C, the only
- non-word-constituent character that is valid in symbols is underscore (`_').
-
- -- Syntax class: punctuation character
- Punctuation characters (`.') are those characters that are used as punctuation
- in English, or are used in some way in a programming language to separate
- symbols from one another. Most programming language modes, including Emacs
- Lisp mode, have no characters in this class since the few characters that are
- not symbol or word constituents all have other uses.
-
- -- Syntax class: open parenthesis character
- -- Syntax class: close parenthesis character
- Open and close parenthesis characters are characters used in dissimilar pairs
- to surround sentences or expressions. Such a grouping is begun with an open
- parenthesis character and terminated with a close. Each open parenthesis
- character matches a particular close parenthesis character, and vice versa.
- Normally, Emacs indicates momentarily the matching open parenthesis when you
- insert a close parenthesis. See Blinking.
-
- The class of open parentheses is designated with `(', and that of close
- parentheses with `)'.
-
- In English text, and in C code, the parenthesis pairs are `()', `[]', and `{}'.
- In Emacs Lisp, the delimiters for lists and vectors (`()' and `[]') are
- classified as parenthesis characters.
-
- -- Syntax class: string quote
- String quote characters (designated with `"') is used to delimit string
- constants in many languages, including Lisp and C. The same string quote
- character appears at the beginning and the end of a string. Such quoted
- strings do not nest.
-
- The parsing facilities of Emacs consider a string as a single token. The usual
- syntactic meanings of the characters in the string are suppressed.
-
- The Lisp modes have two string quote characters: double-quote (`"') and
- vertical bar (`|'). `|' is not used in Emacs Lisp, but it is used in Common
- Lisp. C also has two string quote characters: double-quote for strings, and
- single-quote (`'') for character constants.
-
- English text has no string quote characters because English is not a
- programming language. Although quotation marks are used in English, we do not
- want them to turn off the usual syntactic properties of other characters in the
- quotation.
-
- -- Syntax class: escape
- An escape character (designated with `\') starts an escape sequence such as is
- used in C string and character constants. The character `\' belongs to this
- class in both C and Lisp. (In C, it is used thus only inside strings, but it
- turns out to cause no trouble to treat it this way throughout C code.)
-
- -- Syntax class: character quote
- A character quote character (designated with `/') quotes the following
- character so that it loses its normal syntactic meaning. This differs from an
- escape character in that only the character immediately following is ever
- affected.
-
- This class is not currently used in any standard Emacs modes.
-
- -- Syntax class: paired delimiter
- Paired delimiter characters (designated with `$') are like string quote
- characters except that the syntactic properties of the characters between the
- delimiters are not suppressed. Only TeX mode uses a paired identical delimiter
- presently---the `$' that begins and ends math mode.
-
- -- Syntax class: expression prefix
- An expression prefix operator (designated with `'') is used for syntactic
- operators that are part of an expression if they appear next to one but are not
- part of an adjoining symbol. These characters in Lisp include the apostrophe,
- `'' (used for quoting), and the comma, `,' (used in macros).
-
- -- Syntax class: comment starter
- -- Syntax class: comment ender
- The comment starter and comment ender characters are used in different
- languages to delimit comments. These classes are designated with `<' and `>',
- respectively.
-
- English text has no comment characters. In Lisp, the semi-colon (`;') starts a
- comment and a newline or formfeed ends one.
-
-
- ΓòÉΓòÉΓòÉ 33.1.2. Syntax Flags ΓòÉΓòÉΓòÉ
-
- In addition to the classes, entries for characters in a syntax table can
- include flags. There are four possible flags, represented by the characters
- `1', `2', `3', and `4'. All are used to describe multi-character comment
- delimiters. A flag indicates that the character for which the entry is being
- made can also be part of a comment sequence, in addition to the syntactic
- properties associated with its character class. The flags are independent of
- the class and each other for the sake of characters such as `*' in C mode,
- which is a punctuation character, and the second character of a
- start-of-comment sequence (`/*'), and the first character of an end-of-comment
- sequence (`*/').
-
- The flags for a character c are:
-
- o `1' means c is the start of a two-character comment start sequence.
-
- o `2' means c is the second character of such a sequence.
-
- o `3' means c is the start of a two-character comment end sequence.
-
- o `4' means c is the second character of such a sequence.
-
-
- ΓòÉΓòÉΓòÉ 33.2. Syntax Table Functions ΓòÉΓòÉΓòÉ
-
- In this section we describe functions for creating, accessing and altering
- syntax tables.
-
- -- Function: make-syntax-table &optional table
- This function constructs a copy of table and returns it. If table is not
- supplied (or is nil), it returns a copy of the current syntax table.
- Otherwise, an error is signaled if table is not a syntax table.
-
- -- Function: copy-syntax-table &optional table
- This function is identical to make-syntax-table.
-
- -- Command: modify-syntax-entry char syntax-descriptor &optional table
- This function sets the syntax entry for char according to syntax-descriptor.
- The syntax is changed only for table, which defaults to the current buffer's
- syntax table, and not in any other syntax table. The argument
- syntax-descriptor specifies the desired syntax; this is a string beginning with
- a class designator character, and optionally containing a matching character
- and flags as well. See Syntax Descriptors.
-
- This function always returns nil. The old syntax information in the table for
- this character is discarded.
-
- An error is signaled if the first character of the syntax descriptor is not one
- of the twelve syntax class designator characters. An error is also signaled if
- char is not a character.
-
- Examples:
-
- ;; Put the space character in class whitespace.
- (modify-syntax-entry ?\ " ")
- => nil
-
- ;; Make `$' an open parenthesis character,
- ;; with `^' as its matching close.
- (modify-syntax-entry ?$ "(^")
- => nil
- ;; Make `^' a close parenthesis character,
- ;; with `$' as its matching open.
- (modify-syntax-entry ?^ ")$")
- => nil
-
- ;; Make `/' a punctuation character,
- ;; the first character of a start-comment sequence,
- ;; and the second character of an end-comment sequence.
- ;; This is used in C mode.
- (modify-syntax-entry ?/ ".13")
- => nil
-
- -- Function: char-syntax character
- This function returns the syntax class of character, represented by its
- mnemonic designator character. This only returns the class, not any matching
- parenthesis or flags.
-
- An error is signaled if char is not a character.
-
- The first example shows that the syntax class of space is whitespace
- (represented by a space). The second example shows that the syntax of `/' is
- punctuation in C-mode. This does not show the fact that it is also a comment
- sequence character. The third example shows that open parenthesis is in the
- class of open parentheses. This does not show the fact that it has a matching
- character, `)'.
-
- (char-to-string (char-syntax ?\ ))
- => " "
-
- (char-to-string (char-syntax ?/))
- => "."
-
- (char-to-string (char-syntax ?\())
- => "("
-
- -- Function: set-syntax-table table
- This function makes table the syntax table for the current buffer. It returns
- table.
-
- -- Function: syntax-table
- This function returns the current syntax table, which is the table for the
- current buffer.
-
- -- command: describe-syntax
- This function describes the syntax specifications of the current syntax table.
- It makes a listing in the `*Help*' buffer, and then pops up a window to display
- it. It returns nil.
-
- A portion of a description is shown here:
-
- (describe-syntax)
- => nil
-
- ---------- Buffer: *Help* ----------
- C-q \ which means: escape
- C-r .. C-_ which means: whitespace
- ! . which means: punctuation
- ( () which means: open, matches )
- ) )( which means: close, matches (
- * .. + _ which means: symbol
- , . which means: punctuation
- - _ which means: symbol
- . . which means: punctuation
- / . 13 which means: punctuation,
- is the first character of a comment-start sequence,
- is the first character of a comment-end sequence
- 0 .. 9 w which means: word
- ---------- Buffer: *Help* ----------
-
-
- ΓòÉΓòÉΓòÉ 33.3. Parsing and Moving Over Balanced Expressions ΓòÉΓòÉΓòÉ
-
- Here are several functions for parsing and scanning balanced expressions. The
- syntax table controls the interpretation of characters, so these functions can
- be used for Lisp expressions when in Lisp mode and for C expressions when in C
- mode. See List Motion, for convenient higher-level functions for moving over
- balanced expressions.
-
- -- Function: parse-partial-sexp start limit &optional target-depth stop-before
- state
- This function parses an expression in the current buffer starting at start,
- not scanning past limit. Parsing stops at limit or when certain criteria
- described below are met; point is set to the location where parsing stops. The
- value returned is a description of the status of the parse at the point where
- it stops.
-
- Normally, start is assumed to be the top level of an expression to be parsed,
- such as the beginning of a function definition. Alternatively, you might wish
- to resume parsing in the middle of an expression. To do this, you must provide
- a state argument that describes the initial status of parsing. If state is
- omitted (or nil), parsing assumes that start is the beginning of a new parse at
- level 0.
-
- If the third argument target-depth is non-nil, parsing stops if the depth in
- parentheses becomes equal to target-depth. The depth starts at 0, or at
- whatever is given in state.
-
- If the fourth argument stop-before is non-nil, parsing stops when it comes to
- any character that starts a sexp.
-
- The fifth argument state is a seven-element list of the same form as the value
- of this function, described below. The return value of one call may be used to
- initialize the state of the parse on another call to parse-partial-sexp.
-
- The result is a list of seven elements describing the final state of the
- parse:
-
- 1. The depth in parentheses, starting at 0.
-
- 2. The character position of the start of the innermost containing
- parenthetical grouping; nil if none.
-
- 3. The character position of the start of the last complete subexpression
- terminated; nil if none.
-
- 4. Non-nil if inside a string. (It is the character that will terminate the
- string.)
-
- 5. t if inside a comment.
-
- 6. t if point is just after a quote character.
-
- 7. The minimum parenthesis depth encountered during this scan.
-
- Elements 1, 4, 5, and 6 are significant in the argument state.
-
- This function is used to determine how to indent lines in programs written in
- languages that have nested parentheses.
-
- -- Function: scan-lists from count depth
- This function scans forward count balanced parenthetical groupings from
- character number from. It returns the character number of the position thus
- found.
-
- If depth is nonzero, parenthesis depth counting begins from that value. The
- only candidates for stopping are places where the depth in parentheses becomes
- zero; scan-lists counts count such places and then stops. Thus, a positive
- value for depth means go out levels of parenthesis.
-
- Comments are ignored if parse-sexp-ignore-comments is non-nil.
-
- If the beginning or end of the buffer (or its accessible portion) is reached
- and the depth is not zero, an end-of-file error is signaled. If the depth is
- zero but the count is not used up, nil is returned.
-
- -- Function: scan-sexps from count
- Scan from character number from by count balanced expressions. It returns the
- character number of the position thus found.
-
- Comments are ignored if parse-sexp-ignore-comments is non-nil.
-
- If the beginning or end of (the accessible part of) the buffer is reached in
- the middle of a parenthetical grouping, an end-of-file error is signaled. If
- the beginning or end is reached between groupings but before count is used up,
- nil is returned.
-
- -- Function: backward-prefix-chars
- This function moves point backward over any number of chars with expression
- prefix syntax.
-
- -- Variable: parse-sexp-ignore-comments
- If the value is non-nil, then comments are treated as whitespace by the
- functions in this section and by forward-sexp.
-
- This works only when the comment terminator is something like `*/', and
- appears only to end a comment. If comments are terminated by newlines, you
- must make this variable nil, since not every newline is the end of a comment.
- (In version 19, this limitation is removed.)
-
-
- ΓòÉΓòÉΓòÉ 33.4. Some Standard Syntax Tables ΓòÉΓòÉΓòÉ
-
- Each of the major modes in Emacs has its own syntax table. Here are several
- of them:
-
- -- Function: standard-syntax-table
- This function returns the standard syntax table, which is the syntax table used
- in Fundamental mode.
-
- -- Variable: text-mode-syntax-table
- The value of this variable is the syntax table used in Text mode.
-
- -- Variable: c-mode-syntax-table
- The value of this variable is the syntax table in use in C-mode buffers.
-
- -- Variable: emacs-lisp-mode-syntax-table
- The value of this variable is the syntax table used in Emacs Lisp mode by
- editing commands. (It has no effect on the Lisp read function.)
-
-
- ΓòÉΓòÉΓòÉ 33.5. Syntax Table Internals ΓòÉΓòÉΓòÉ
-
- Each element of a syntax table is an integer that translates into the full
- meaning of the entry: class, possible matching character, and flags. However,
- it is not common for a programmer to work with the entries directly in this
- form since the Lisp-level syntax table functions usually work with syntax
- descriptors (see Syntax Descriptors).
-
- The low 8 bits of each element of a syntax table indicates the syntax class.
-
- Integer
- Class
-
- 0
- whitespace
-
- 1
- punctuation
-
- 2
- word
-
- 3
- symbol
-
- 4
- open parenthesis
-
- 5
- close parenthesis
-
- 6
- expression prefix
-
- 7
- string quote
-
- 8
- paired delimiter
-
- 9
- escape
-
- 10
- character quote
-
- 11
- comment-start
-
- 12
- comment-end
-
- The next 8 bits are the matching opposite parenthesis (if the character has
- parenthesis syntax); otherwise, they are not meaningful. The next 4 bits are
- the flags.
-
-
- ΓòÉΓòÉΓòÉ 34. Abbrevs And Abbrev Expansion ΓòÉΓòÉΓòÉ
-
- An abbreviation or abbrev is a string of characters that may be expanded to a
- longer string. The user can insert the abbrev string and find it replaced
- automatically with the expansion of the abbrev. This saves typing.
-
- The set of abbrevs currently in effect is recorded in an abbrev table. Each
- buffer has a local abbrev table, but normally all buffers in the same major
- mode share one abbrev table. There is also a global abbrev table. Normally
- both are used.
-
- An abbrev table is represented as an obarray containing a symbol for each
- abbreviation. The symbol's name is the abbreviation. Its value is the
- expansion; its function definition is the hook; its property list cell contains
- the use count, the number of times the abbreviation has been expanded. Because
- these symbols are not inturned in the usual obarray, they will never appear as
- the result of reading a Lisp expression; in fact, they will never be used
- except by the code that handles abbrevs. Therefore, it is safe to use them in
- an extremely nonstandard way. See Creating Symbols.
-
- For the user-level commands for abbrevs, see Abbrev Mode.
-
-
- ΓòÉΓòÉΓòÉ 34.1. Setting Up Abbrev Mode ΓòÉΓòÉΓòÉ
-
- Abbrev mode is a minor mode controlled by the value of the variable
- abbrev-mode.
-
- -- Variable: abbrev-mode
- A non-nil value of this variable turns on the automatic expansion of abbrevs
- when their abbreviations are inserted into a buffer. If the value is nil,
- abbrevs may be defined, but they are not expanded automatically.
-
- This variable automatically becomes local when set in any fashion.
-
- -- Variable: default-abbrev-mode
- This is the value abbrev-mode for buffers that do not override it. This is the
- same as (default-value 'abbrev-mode).
-
-
- ΓòÉΓòÉΓòÉ 34.2. Abbrev Tables ΓòÉΓòÉΓòÉ
-
- This section describes how to create and manipulate abbrev tables.
-
- -- Function: make-abbrev-table
- This function creates and returns a new, empty abbrev table---an obarray
- containing no symbols. It is a vector filled with nils.
-
- -- Function: clear-abbrev-table table
- This function undefines all the abbrevs in abbrev table table, leaving it
- empty. The function returns nil.
-
- -- Function: define-abbrev-table tabname definitions
- This function defines tabname (a symbol) as an abbrev table name, i.e., as a
- variable whose value is an abbrev table. It defines abbrevs in the table
- according to definitions, a list of elements of the form (abbrevname expansion
- hook usecount). The value is always nil.
-
- -- Variable: abbrev-table-name-list
- This is a list of symbols whose values are abbrev tables. define-abbrev-table
- adds the new abbrev table name to this list.
-
- -- Function: insert-abbrev-table-description name human
- This function inserts before point a description of the abbrev table named
- name. The argument name is a symbol whose value is an abbrev table. The value
- is always nil.
-
- If human is non-nil, a human-oriented description is inserted. Otherwise the
- description is a Lisp expression---a call to define-abbrev-table which would
- define name exactly as it is currently defined.
-
-
- ΓòÉΓòÉΓòÉ 34.3. Defining Abbrevs ΓòÉΓòÉΓòÉ
-
- These functions define an abbrev in a specified abbrev table. define-abbrev is
- the low-level basic function, while add-abbrev is used by commands that ask for
- information from the user.
-
- -- Function: add-abbrev table type arg
- This function adds an abbreviation to abbrev table table. The argument type is
- a string describing in English the kind of abbrev this will be (typically,
- "global" or "mode-specific"); this is used in prompting the user. The argument
- arg is the number of words in the expansion.
-
- The return value is the symbol which internally represents the new abbrev, or
- nil if the user declines to redefine an existing abbrev.
-
- -- Function: define-abbrev table name expansion hook
- This function defines an abbrev in table named name, to expand to expansion,
- and call hook. The return value is an uninterned symbol which represents the
- abbrev inside Emacs; its name is name.
-
- The argument name should be a string. The argument expansion should be a
- string, or nil, to undefine the abbrev.
-
- The argument hook is a function or nil. If hook is non-nil, then it is called
- with no arguments after the abbrev is replaced with expansion; point is located
- at the end of expansion.
-
- The use count of the abbrev is initialized to zero.
-
- -- User Option: only-global-abbrevs
- If this variable is non-nil, it means that the user plans to use global abbrevs
- only. This tells the commands that define mode-specific abbrevs to define
- global ones instead. This variable does not alter the functioning of the
- functions in this section; it is examined by their callers.
-
-
- ΓòÉΓòÉΓòÉ 34.4. Saving Abbrevs in Files ΓòÉΓòÉΓòÉ
-
- A file of saved abbrev definitions is actually a file of Lisp code. The
- abbrevs are saved in the form of a Lisp program to define the same abbrev
- tables with the same contents. Therefore, you can load the file with load (see
- How Programs Do Loading). However, the function quietly-read-abbrev-file is
- provided as a more convenient interface.
-
- User-level facilities such as save-some-buffers can save abbrevs in a file
- automatically, under the control of variables described here.
-
- -- User Option: abbrev-file-name
- This is the default file name for reading and saving abbrevs.
-
- -- Function: quietly-read-abbrev-file filename
- This function reads abbrev definitions from a file named filename, previously
- written with write-abbrev-file. If filename is nil, the file specified in
- abbrev-file-name is used. save-abbrevs is set to t so that changes will be
- saved.
-
- This function does not display any messages. It returns nil.
-
- -- User Option: save-abbrevs
- A non-nil value for save-abbrev means that Emacs should save abbrevs when files
- are saved. abbrev-file-name specifies the file to save the abbrevs in.
-
- -- Variable: abbrevs-changed
- This variable is set non-nil by defining or altering any abbrevs. This serves
- as a flag for various Emacs commands to offer to save your abbrevs.
-
- -- Command: write-abbrev-file filename
- Save all abbrev definitions, in all abbrev tables, in the file filename as a
- Lisp program which will define the same abbrevs when loaded. This function
- returns nil.
-
-
- ΓòÉΓòÉΓòÉ 34.5. Looking Up and Expanding Abbreviations ΓòÉΓòÉΓòÉ
-
- Abbrevs are usually expanded by commands for interactive use, or automatically
- by self-insert. This section describes the subroutines used in writing such
- functions, as well as the variables they use for communication.
-
- -- Function: abbrev-symbol abbrev table
- This function returns the symbol representing the abbrev named abbrev. The
- value returned is nil if that abbrev is not defined. The optional second
- argument table is the abbrev table to look it up in. By default, this function
- tries first the current buffer's local abbrev table, and second the global
- abbrev table.
-
- -- User Option: abbrev-all-caps
- When this is set non-nil, an abbrev entered entirely in upper case is expanded
- using all upper case. Otherwise, an abbrev entered entirely in upper case is
- expanded by capitalizing each word of the expansion.
-
- -- Function: abbrev-expansion abbrev &optional table
- This function returns the string that abbrev would expand into (as defined by
- the abbrev tables used for the current buffer). The optional argument table
- specifies the abbrev table to use; if it is specified, the abbrev is looked up
- in that table only.
-
- -- Variable: abbrev-start-location
- This is the buffer position for expand-abbrev to use as the start of the next
- abbrev to be expanded. nil means use the word before point as the abbrev.
- abbrev-start-location is set to nil each time expand-abbrev is called. This
- variable is set by abbrev-prefix-mark.
-
- -- Variable: abbrev-start-location-buffer
- The value of this variable is the buffer for which abbrev-start-location has
- been set. Trying to expand an abbrev in any other buffer clears
- abbrev-start-location. This variable is set by abbrev-prefix-mark.
-
- -- Variable: last-abbrev
- This is the abbrev-symbol of the last abbrev expanded. This information is
- left by expand-abbrev for the sake of the unexpand-abbrev command.
-
- -- Variable: last-abbrev-location
- This is the location of the last abbrev expanded. This contains information
- left by expand-abbrev for the sake of the unexpand-abbrev command.
-
- -- Variable: last-abbrev-text
- This is the exact expansion text of the last abbrev expanded, as results from
- case conversion. Its value is nil if the abbrev has already been unexpanded.
- This contains information left by expand-abbrev for the sake of the
- unexpand-abbrev command.
-
-
- ΓòÉΓòÉΓòÉ 34.6. Standard Abbrev Tables ΓòÉΓòÉΓòÉ
-
- Here we list the variables that hold the abbrev tables for the preloaded major
- modes of Emacs.
-
- -- Variable: global-abbrev-table
- This is the abbrev table for mode-independent abbrevs. The abbrevs defined in
- it apply to all buffers. Each buffer may also have a local abbrev table, whose
- abbrev definitions take precedence over those in the global table.
-
- -- Variable: local-abbrev-table
- The value of this buffer-local variable is the (mode-specific) abbreviation
- table of the current buffer.
-
- -- Variable: fundamental-mode-abbrev-table
- This is the local abbrev table used in Fundamental mode. It is the local
- abbrev table in all buffers in Fundamental mode.
-
- -- Variable: text-mode-abbrev-table
- This is the local abbrev table used in Text mode.
-
- -- Variable: c-mode-abbrev-table
- This is the local abbrev table used in C mode.
-
- -- Variable: lisp-mode-abbrev-table
- This is the local abbrev table used in Lisp mode and Emacs Lisp mode.
-
-
- ΓòÉΓòÉΓòÉ 35. Processes ΓòÉΓòÉΓòÉ
-
- In the terminology of operating systems, a process is a space in which a
- program can execute. Emacs runs in a process. Emacs Lisp programs can invoke
- other programs in processes of their own. These are called subprocesses or
- child processes of the Emacs process, which is their parent process.
-
- A subprocess of Emacs may be synchronous or asynchronous. depending on how it
- is created. When you create a synchronous subprocess, the Lisp program waits
- for the subprocess to terminate before continuing execution. When you create
- an asynchronous subprocess, it can run in parallel with the Lisp program. This
- kind of subprocess is represented within Emacs by a Lisp object which is also
- called a ``process''. Lisp programs can use this object to communicate with
- the subprocess or to control it. For example, you can send signals, obtain
- status information, receive output from the process, or send input to it.
-
- -- Function: processp object
- This function returns t if object is a process, nil otherwise.
-
-
- ΓòÉΓòÉΓòÉ 35.1. Functions that Create Subprocesses ΓòÉΓòÉΓòÉ
-
- There are three functions that create a new Unix subprocess in which to run a
- program. One of them, start-process, creates an asynchronous process and
- returns a process object ( see Asynchronous Processes). The other two,
- call-process and call-process-region, create a synchronous process and do not
- return a process object (see Synchronous Processes).
-
- Synchronous and asynchronous processes are explained in following sections.
- Since the three functions are all called in a similar fashion, their common
- arguments are described here.
-
- In all cases, the program to be run is specified with the function's program
- argument. An error is signaled if the file is not found or cannot be executed.
- The actual file containing the program is found by following normal Unix rules:
- if an absolute file name is given, then the program must be found in the
- specified file; if a relative file name is given, then the directories in
- exec-path are searched sequentially for a suitable file. The variable
- exec-path is initialized when Emacs is started, based on the value of the
- environment variable PATH. The standard Unix abbreviations, `~', `.', and
- `..', are interpreted as usual, but environment variable substitutions
- (`$HOME', etc.) are not recognized; use substitute-in-file-name to perform them
- ( see File Name Expansion).
-
- Each of the subprocess-creating functions has a buffer-or-name argument which
- specifies where the standard output from the program will go. If
- buffer-or-name is nil, then the output will be discarded (by directing it to
- `/dev/null') unless a filter function is specified to handle it. (See Filter
- Functions, and Streams.) Normally, you should avoid having multiple processes
- send output to the same buffer because the outputs will be intermixed randomly.
-
- All three of the subprocess-creating functions have a &rest argument, args.
- The args must all be strings, and they are supplied to program as separate
- command line arguments. Wildcard characters and other shell constructs are not
- allowed in these strings, since they are passed directly to the specified
- program. *Note:* the argument program contains only the name of the program;
- it may not contain any command-line arguments. Such arguments must be provided
- via args.
-
- The subprocess gets its current directory from the value of default-directory
- (see File Name Expansion).
-
- The subprocess inherits its environment from Emacs; but you can specify
- overrides for it with process-environment.
-
- -- Variable: process-environment
- This variable is a list of strings to append to the environment of processes as
- they are created. Each string assigns a value to a shell environment variable.
- (This applies both to asynchronous and synchronous processes.)
-
- process-environment
- => ("l=/usr/stanford/lib/gnuemacs/lisp"
- "PATH=.:/user/lewis/bin:/usr/class:/nfsusr/local/bin"
- "USER=lewis"
- "TERM=ibmapa16"
- "SHELL=/bin/csh"
- "HOME=/user/lewis")
-
- -- Variable: exec-directory
- The value of this variable is the name of a directory (a string) that contains
- programs that come with GNU Emacs, that are intended for Emacs to invoke. The
- program loadst is an example of such a program; it is used by the display-time
- command to print the current time (and certain other information) once per
- minute.
-
- The default value is the name of a directory whose name ends in `etc'. We call
- the directory `emacs/etc', since its name usually ends that way. We sometimes
- refer to ``the directory `emacs/etc','' when strictly speaking we ought to say,
- ``the directory named by the variable exec-directory.'' Most of the time,
- there is no difference.
-
- -- User Option: exec-path
- The value of this variable is a list of directories to search for programs to
- run in subprocesses. Each element is either the name of a directory (i.e., a
- string), or nil, which stands for the default directory (which is the value of
- default-directory).
-
- The value of exec-path is used by call-process and start-process when the
- program argument is not an absolute file name.
-
-
- ΓòÉΓòÉΓòÉ 35.2. Creating a Synchronous Process ΓòÉΓòÉΓòÉ
-
- After a synchronous process is created, Emacs waits for the process to
- terminate before continuing. Starting Dired is an example of this: it runs ls
- in a synchronous process, then modifies the output slightly. Because the
- process is synchronous, the entire directory listing arrives in the buffer
- before Emacs tries to do anything with it.
-
- While Emacs waits for the synchronous subprocess to terminate, the user can
- quit by typing C-g, and the process is killed by sending it a SIGKILL signal.
- See Quitting.
-
- The synchronous subprocess functions return nil in version 18. In version 19,
- they will return an indication of how the process terminated.
-
- -- Function: call-process program &optional infile buffer-or-name display &rest
- args
- This function calls program in a separate process and waits for it to finish.
-
- The standard input for the process comes from file infile if infile is not nil
- and from `/dev/null' otherwise. The process output gets inserted in buffer
- buffer-or-name before point, if that argument names a buffer. If
- buffer-or-name is t, output is sent to the current buffer; if buffer-or-name is
- nil, output is discarded.
-
- If buffer-or-name is the integer 0, the output is discarded and call-process
- returns immediately. In this case, the process is not truly synchronous, since
- it can run in parallel with Emacs; but you can think of it as synchronous in
- that Emacs is essentially finished with the subprocess as soon as this function
- returns.
-
- If display is non-nil, then call-process redisplays the buffer as output is
- inserted. Otherwise the function does no redisplay, and the results become
- visible on the screen only when Emacs redisplays that buffer in the normal
- course of events.
-
- The remaining arguments, args, are strings that are supplied as the command
- line arguments for the program.
-
- The examples below are both run with the buffer `foo' current.
-
- (call-process "pwd" nil t)
- => nil
-
- ---------- Buffer: foo ----------
- /usr/user/lewis/manual
- ---------- Buffer: foo ----------
-
- (call-process "grep" nil "bar" nil "lewis" "/etc/passwd")
- => nil
-
- ---------- Buffer: bar ----------
- lewis:5LTsHm66CSWKg:398:21:Bil Lewis:/user/lewis:/bin/csh
-
- ---------- Buffer: bar ----------
-
- The dired-readin function contains a good example of the use of call-process:
-
- (call-process "ls" nil buffer nil dired-listing-switches dirname)
-
- -- Function: call-process-region start end program &optional delete
- buffer-or-name display &rest args
- This function sends the text between start to end as standard input to a
- process running program. It deletes the text sent if delete is non-nil, which
- may be useful when the output is going to be inserted back in the current
- buffer.
-
- If buffer-or-name names a buffer, the output is inserted in that buffer at
- point. If buffer-or-name is t, the output is sent to the current buffer. If
- buffer-or-name is nil, the output is discarded. If buffer-or-name is the
- integer 0, the output is discarded and call-process returns immediately, as in
- call-process.
-
- If display is non-nil, then call-process-region redisplays the buffer as output
- is inserted. Otherwise the function does no redisplay, and the results become
- visible on the screen only when Emacs redisplays that buffer in the normal
- course of events.
-
- The remaining arguments, args, are strings that are supplied as the command
- line arguments for the program.
-
- In the following example, we use call-process-region to run the cat utility,
- with standard input being the first five characters in buffer `foo' (the word
- `input'). cat copies its standard input into its standard output. Since the
- argument buffer-or-name is t, this output is inserted in the current buffer.
-
- ---------- Buffer: foo ----------
- input-!-
- ---------- Buffer: foo ----------
-
- (call-process-region 1 6 "cat" nil t)
- => nil
-
- ---------- Buffer: foo ----------
- inputinput-!-
- ---------- Buffer: foo ----------
-
- The shell-command-on-region command uses call-process-region like this:
-
- (call-process-region start end
- shell-file-name ; Name of program.
- nil ; Do not delete region.
- buffer ; Send output to buffer.
- nil ; No redisplay during output.
- "-c" command) ; Arguments for the shell.
-
-
- ΓòÉΓòÉΓòÉ 35.3. Creating an Asynchronous Process ΓòÉΓòÉΓòÉ
-
- After an asynchronous process is created, Emacs and the Lisp program can
- continue running immediately. The process may thereafter run in parallel with
- Emacs, and the two may communicate with each other using the functions
- described in following sections. Here we describe how to create an
- asynchronous process, with start-process.
-
- -- Function: start-process name buffer-or-name program &rest args
- This function creates a new asynchronous subprocess and starts the program
- program running in it. It returns a process object that stands for the new
- subprocess for Emacs Lisp programs. The argument name specifies the name for
- the process object; if a process with this name already exists, then name is
- modified (by adding `<1>', etc.) to be unique. The buffer buffer-or-name is
- the buffer to associate with the process.
-
- The remaining arguments, args, are strings that are supplied as the command
- line arguments for the program.
-
- In the example below, the first process is started and runs (rather, sleeps)
- for 100 seconds. Meanwhile, the second process is started, given the name
- `my-process<1>' for the sake of uniqueness. It inserts the directory listing
- at the end of the buffer `foo', before the first process finishes. Then it
- finishes, and a message to that effect is inserted in the buffer. Much later,
- the first process finishes, and another message is inserted in the buffer for
- it.
-
- (start-process "my-process" "foo" "sleep" "100")
- => #<process my-process>
-
- (start-process "my-process" "foo" "ls" "-l" "/user/lewis/bin")
- => #<process my-process<1>>
-
- ---------- Buffer: foo ----------
- total 2
- lrwxrwxrwx 1 lewis 14 Jul 22 10:12 gnuemacs --> /emacs
- -rwxrwxrwx 1 lewis 19 Jul 30 21:02 lemon
-
- Process my-process<1> finished
-
- Process my-process finished
- ---------- Buffer: foo ----------
-
- -- Variable: process-connection-type
- This variable controls the type of device used to communicate with asynchronous
- subprocesses. If it is nil, then pipes are used. If it is t, then ptys are
- used (or pipes if ptys not supported).
-
- ptys are usually preferable for processes visible to the user, as in Shell
- mode, because they allow job control (C-c, C-z, etc.) to work between the
- process and its children whereas pipes do not. For subprocesses used for
- internal purposes by programs, it is often better to use a pipe, because they
- are more efficient. In addition, the total number of ptys is limited on many
- systems and it is good not to waste them.
-
- The value process-connection-type is used when start-process is called, so in
- order to change it for just one call of start-process, temporarily rebind it
- with let.
-
- (let ((process-connection-type nil)) ; Use a pipe.
- (start-process ...))
-
-
- ΓòÉΓòÉΓòÉ 35.4. Deleting Processes ΓòÉΓòÉΓòÉ
-
- Deleting a process disconnects Emacs immediately from the subprocess, and
- removes it from the list of active processes. It sends a signal to the
- subprocess to make the subprocess terminate, but this is not guaranteed to
- happen immediately. (The process object itself continues to exist as long as
- other Lisp objects point to it.)
-
- You can delete a process explicitly at any time. Processes are deleted
- automatically after they terminate, but not necessarily right away. If you
- delete a terminated process explicitly before it is deleted automatically, no
- harm results.
-
- -- Variable: delete-exited-processes
- This variable controls automatic deletion of processes that have terminated
- (due to calling exit or to a signal). If it is nil, then they continue to
- exist until the user runs list-processes. Otherwise, they are deleted
- immediately after they exit.
-
- -- Function: delete-process name
- This function deletes the process associated with name. The argument name may
- be a process, the name of a process, a buffer, or the name of a buffer. The
- subprocess is killed with a SIGHUP signal.
-
- (delete-process "*shell*")
- => nil
-
- -- Function: process-kill-without-query process
- This function declares that Emacs need not query the user if process is still
- running when Emacs is exited. The process will be deleted silently. The value
- is t.
-
- (process-kill-without-query (get-process "shell"))
- => t
-
-
- ΓòÉΓòÉΓòÉ 35.5. Process Information ΓòÉΓòÉΓòÉ
-
- Several functions return information about processes. list-processes is
- provided for interactive use.
-
- -- Command: list-processes
- This command displays a listing of all living processes. (Any processes listed
- as `Exited' or `Signaled' are actually eliminated after the listing is made.)
- This function returns nil.
-
- -- Function: process-list
- This function returns a list of all processes that have not been deleted.
-
- (process-list)
- => (#<process display-time> #<process shell>)
-
- -- Function: get-process name
- This function returns the process named name, or nil if there is none. An
- error is signaled if name is not a string.
-
- (get-process "shell")
- => #<process shell>
-
- -- Function: process-command process
- This function returns the command that was executed to start process. This is
- a list of strings, the first string being the program executed and the rest of
- the strings being the arguments that were given to the program.
-
- (process-command (get-process "shell"))
- => ("/bin/csh" "-i")
-
- -- Function: process-exit-status process
- This function returns the exit status of process or the signal number that
- killed it. If process has not yet terminated, the value is 0.
-
- -- Function: process-id process
- This function returns the pid of process. This is an integer which
- distinguishes the process process from all other processes running on the same
- computer at the current time. The pid of a process is chosen by the operating
- system kernel when the process is started and remains constant as long as the
- process exists.
-
- -- Function: process-name process
- This function returns the name of process.
-
- -- Function: process-status process-name
- This function returns the status of process-name as a symbol. The argument
- process-name must be either a process or a string. If it is a string, it need
- not name an actual process.
-
- The possible values for an actual subprocess are:
-
- run
- for a process that is running.
-
- stop
- for a process that is stopped but continuable.
-
- exit
- for a process that has exited.
-
- signal
- for a process that has received a fatal signal.
-
- nil
- if process-name is not the name of an existing process.
-
- (process-status "shell")
- => run
- (process-status "never-existed")
- => nil
- x
- => #<process xx<1>>
- (process-status x)
- => exit
-
- For a network stream, process-status returns one of the symbols open or closed.
- The latter means that the other side closed the connection, or Emacs did
- delete-process.
-
-
- ΓòÉΓòÉΓòÉ 35.6. Sending Input to Processes ΓòÉΓòÉΓòÉ
-
- Asynchronous subprocesses receive input when it is sent to them by Emacs,
- which is done with the functions in this section. You must specify the process
- to send input to, and the input data to send. The data appears on the
- ``standard input'' of the subprocess.
-
- Some operating systems have limited space for buffered input in a pty. On
- these systems, the subprocess will cease to read input correctly if you send an
- input line longer than the system can handle. You cannot avoid the problem by
- breaking the input into pieces and sending them separately, for the operating
- system will still have to put all the pieces together in the input buffer
- before it lets the subprocess read the line. The only solution is to put the
- input in a temporary file, and send the process a brief command to read that
- file.
-
- -- Function: process-send-string process-name string
- This function sends process-name the contents of string as standard input.
- The argument process-name must be a process or the name of a process.
-
- The function returns nil.
-
- (process-send-string "shell<1>" "ls\n")
- => nil
-
- ---------- Buffer: *shell* ----------
- ...
- introduction.texi syntax-tables.texi~
- introduction.texi~ text.texi
- introduction.txt text.texi~
- ...
- ---------- Buffer: *shell* ----------
-
- -- Command: process-send-region process-name start end
- This function sends the text in the region defined by start and end as
- standard input to process-name, which is a process or a process name.
-
- An error is signaled unless both start and end are integers or markers that
- indicate positions in the current buffer. (It is unimportant which number is
- larger.)
-
- -- Function: process-send-eof &optional process-name
- This function makes process-name see an end-of-file in its input. The eof
- comes after any text already sent to it.
-
- If process-name is not supplied, or if it is nil, then this function sends the
- eof to the current buffer's process. An error is signaled if the current
- buffer has no process.
-
- The function returns process-name.
-
- (process-send-eof "shell")
- => "shell"
-
-
- ΓòÉΓòÉΓòÉ 35.7. Sending Signals to Processes ΓòÉΓòÉΓòÉ
-
- Sending a signal to a subprocess is a way of interrupting its activities.
- There are several different signals, each with its own meaning. For example,
- the signal SIGINT means that the user has typed C-c, or that some analogous
- thing has happened.
-
- Each signal has a standard effect on the subprocess. Most signals kill the
- subprocess, but some stop or resume execution instead. Most signals can
- optionally be handled by programs; if the program handles the signal, then we
- can say nothing in general about its effects.
-
- The set of signals and their names is defined by the operating system; Emacs
- has facilities for sending only a few of the signals that are defined. Emacs
- can send signals only to its own subprocesses.
-
- You can send signals explicitly by calling the function in this section.
- Emacs also sends signals automatically at certain times: killing a buffer sends
- a SIGHUP signal to all its associated processes; killing Emacs sends a SIGHUP
- signal to all remaining processes. (SIGHUP is a signal that usually indicates
- that the user hung up the phone.)
-
- Each of the signal-sending functions takes two optional arguments:
- process-name and current-group.
-
- The argument process-name must be either a process, the name of one, or nil.
- If it is nil, the process defaults to the process associated with the current
- buffer. An error is signaled if process-name does not identify a process.
-
- The argument current-group is a flag that makes a difference when you are
- running a job-control shell as an Emacs subprocess. If it is non-nil, then the
- signal is sent to the current process-group of the terminal which Emacs uses to
- communicate with the subprocess. If the process is a job-control shell, this
- means the shell's current subjob. If it is nil, the signal is sent to the
- process group of the immediate subprocess of Emacs. If the subprocess is a
- job-control shell, this is the shell itself.
-
- The flag current-group has no effect when a pipe is used to communicate with
- the subprocess, because the operating system does not support the distinction
- in the case of pipes. For the same reason, job-control shells won't work when
- a pipe is used. See process-connection-type in Asynchronous Processes.
-
- -- Function: interrupt-process &optional process-name current-group
- This function interrupts the process process-name by sending the Unix signal
- SIGINT. Outside of Emacs, typing the ``interrupt character'' (usually C-c on
- Berkeley Unix) sends this signal. When the argument current-group is non-nil,
- you can think of this function as ``typing C-c'' on the terminal by which Emacs
- talks to the subprocess.
-
- -- Function: kill-process &optional process-name current-group
- This function kills the process process-name by sending the Unix signal
- SIGKILL. This signal kills the subprocess immediately, and cannot be handled
- by the subprocess.
-
- -- Function: quit-process &optional process-name current-group
- This function sends the Unix signal SIGQUIT to the process process-name. This
- signal is the one sent by the ``quit character'' (usually C-b or C-\) when you
- are not inside Emacs.
-
- -- Function: stop-process &optional process-name current-group
- This function stops the process process-name by sending the Unix signal
- SIGTSTP. Use continue-process to resume its execution.
-
- On systems with job control, the ``stop character'' (usually C-z) sends this
- signal (outside of Emacs). When current-group is non-nil, you can think of
- this function as ``typing C-z'' on the terminal Emacs uses to communicate with
- the subprocess.
-
- -- Function: continue-process &optional process-name current-group
- This function resumes execution of the process process by sending it the Unix
- signal SIGCONT. This presumes that process-name was stopped previously.
-
-
- ΓòÉΓòÉΓòÉ 35.8. Receiving Output from Processes ΓòÉΓòÉΓòÉ
-
- There are two ways to receive the output that a subprocess writes to its
- standard output stream. The output can be inserted in a buffer, which is
- called the associated buffer of the process, or a function called the filter
- function can be called to act on the output.
-
-
- ΓòÉΓòÉΓòÉ 35.8.1. Process Buffers ΓòÉΓòÉΓòÉ
-
- A process can (and usually does) have an associated buffer, which is an
- ordinary Emacs buffer that is used for two purposes: storing the output from
- the process, and deciding when to kill the process. You can also use the
- buffer to identify a process to operate on, since in normal practice only one
- process is associated with any given buffer. Many applications of processes
- also use the buffer for editing input to be sent to the process, but this is
- not built into Emacs Lisp.
-
- Unless the process has a filter function (see Filter Functions), its output is
- inserted in the associated buffer. The position to insert the output is
- determined by the process-mark ( see Process Information), which is then
- updated to point to the end of the text just inserted. Usually, but not
- always, the process-mark is at the end of the buffer. If the process has no
- buffer and no filter function, its output is discarded.
-
- -- Function: process-buffer process
- This function returns the associated buffer of the process process.
-
- (process-buffer (get-process "shell"))
- => #<buffer *shell*>
-
- -- Function: process-mark process
- This function returns the marker which controls where additional output from
- the process will be inserted in the process buffer ( see Process Buffers).
- When output is inserted, the marker is updated to point at the end of the
- output. This causes successive batches of output to be inserted consecutively.
-
- If process does not insert its output into a buffer, then process-mark returns
- a marker that points nowhere.
-
- Filter functions normally should use this marker in the same fashion as is done
- by direct insertion of output in the buffer. A good example of a filter
- function that uses process-mark is found at the end of the following section.
-
- When the user is expected to enter input in the process buffer for transmission
- to the process, the process marker is useful for distinguishing the new input
- from previous output.
-
- -- Function: set-process-buffer process buffer
- This function sets the buffer associated with process to buffer. If buffer is
- nil, the process will not be associated with any buffer.
-
- -- Function: get-buffer-process buffer-or-name
- This function returns the process associated with buffer-or-name. If there are
- several processes associated with it, then one is chosen. (Presently, the one
- chosen is the one most recently created.) It is usually a bad idea to have
- more than one process associated with the same buffer.
-
- (get-buffer-process "*shell*")
- => #<process shell>
-
- If the process's buffer is killed, the actual child process is killed with a
- SIGHUP signal (see Signals to Processes).
-
-
- ΓòÉΓòÉΓòÉ 35.8.2. Process Filter Functions ΓòÉΓòÉΓòÉ
-
- A process filter function is a function that receives the standard output from
- the associated process. If a process has a filter, then all standard output
- from that process is passed to the filter rather than be inserted into a buffer
- or discarded. The process buffer is used for output from the process only when
- there is no filter.
-
- A filter function must accept two arguments: the associated process and a
- string, which is the output. The function is then free to do whatever it
- chooses with the output.
-
- A filter function runs only while Emacs is waiting (e.g., for terminal input,
- or for time to elapse, or for process output). This avoids the timing errors
- that could result from running filters at random places in the middle of other
- Lisp programs. You may explicitly cause Emacs to wait, so that filter
- functions will run, by calling sit-for, sleep-for or accept-process-output (
- see Accepting Output). Emacs is also waiting when the command loop is reading
- input.
-
- Quitting is normally inhibited within a filter function---otherwise, the
- effect of typing C-g at command level or to quit a user command would be
- unpredictable. If you want to permit quitting inside a filter function, bind
- inhibit-quit to nil. See Quitting.
-
- Many filter functions sometimes or always insert the text in the process's
- buffer, mimicking the actions of Emacs when there is no filter. Such filter
- functions need to use set-buffer in order to be sure to insert in that buffer.
- To avoid setting the current buffer semipermanently, these filter functions
- must use unwind-protect to make sure to restore the previous current buffer.
- They should also update the process marker, and in some cases update the value
- of point. Here is how to do these things:
-
- (defun ordinary-insertion-filter (proc string)
- (let ((old-buffer (current-buffer)))
- (unwind-protect
- (let (moving)
- (set-buffer (process-buffer proc))
- (setq moving (= (point) (process-mark proc)))
- (save-excursion
- ;; Insert the text, moving the process-marker.
- (goto-char (process-mark proc))
- (insert string)
- (set-marker (process-mark proc) (point)))
- (if moving (goto-char (process-mark proc))))
- (set-buffer old-buffer))))
-
- The reason to use an explicit unwind-protect rather than letting save-excursion
- restore the current buffer is so as to preserve the change in point made by
- goto-char.
-
- To make the filter force the process buffer to be visible whenever new text
- arrives, insert the following line just before the unwind-protect:
-
- (display-buffer (process-buffer proc))
-
- To force point to move to the end of the new output no matter where it was
- previously, eliminate the variable moving and call goto-char unconditionally.
-
- All filter functions that do regexp searching or matching should save and
- restore the match data. Otherwise, a filter function that runs during a call
- to sit-for might clobber the match data of the program that called sit-for.
- See Match Data.
-
- The output to the function may come in chunks of any size. A program that
- produces the same output twice in a row may send it as one batch of 200
- characters one time, and five batches of 40 characters the next.
-
- -- Function: set-process-filter process filter
- This function gives process the filter function filter. If filter is nil, then
- the process will have no filter.
-
- -- Function: process-filter process
- This function returns the filter function of process, or nil if it has none.
-
- Here is an example of use of a filter function:
-
- (defun keep-output (process output)
- (setq kept (cons output kept)))
- => keep-output
- (setq kept nil)
- => nil
- (set-process-filter (get-process "shell") 'keep-output)
- => keep-output
- (process-send-string "shell" "ls ~/other\n")
- => nil
- kept
- => ("lewis@slug[8] % "
- "FINAL-W87-SHORT.MSS backup.otl kolstad.mss~
- address.txt backup.psf kolstad.psf
- backup.bib~ david.mss resume-Dec-86.mss~
- backup.err david.psf resume-Dec.psf
- backup.mss dland syllabus.mss
- "
- "#backups.mss# backup.mss~ kolstad.mss
- ")
-
- Here is another, more realistic example, which demonstrates how to use the
- process mark to do insertion in the same fashion as is done when there is no
- filter function:
-
- ;; Insert input in the buffer specified by my-shell-buffer
- ;; and make sure that buffer is shown in some window.
- (defun my-process-filter (proc str)
- (let ((cur (selected-window))
- (pop-up-windows t))
- (pop-to-buffer my-shell-buffer)
- (goto-char (point-max))
- (insert str)
- (set-marker (process-mark proc) (point-max))
- (select-window cur)))
-
-
- ΓòÉΓòÉΓòÉ 35.8.3. Accepting Output from Processes ΓòÉΓòÉΓòÉ
-
- Output from asynchronous subprocesses normally arrives only while Emacs is
- waiting for some sort of external event, such as elapsed time or terminal
- input. Occasionally it is useful in a Lisp program to explicitly permit output
- to arrive at a specific point, or even to wait until output arrives from a
- process.
-
- -- Function: accept-process-output &optional process
- This function allows Emacs to read pending output from processes. The output
- is inserted in the associated buffers or given to their filter functions. If
- process is non-nil then this function does not return until some output has
- been received from process.
-
-
- ΓòÉΓòÉΓòÉ 35.8.4. Sentinels: Detecting Process Status Changes ΓòÉΓòÉΓòÉ
-
- A process sentinel is a function that is called whenever the associated
- process changes status for any reason, including signals (whether sent by Emacs
- or caused by the process's own actions) that terminate, stop, or continue the
- process. The process sentinel is also called if the process exits. The
- sentinel receives two arguments: the process for which the event occurred, and
- a string describing the type of event.
-
- The string describing the event looks like one of the following:
-
- o "finished\n".
-
- o "exited abnormally with code exitcode\n".
-
- o "name-of-signal\n".
-
- o "name-of-signal (core dumped)\n".
-
- A sentinel runs only while Emacs is waiting (e.g., for terminal input, or for
- time to elapse, or for process output). This avoids the timing errors that
- could result from running them at random places in the middle of other Lisp
- programs. You may explicitly cause Emacs to wait, so that sentinels will run,
- by calling sit-for, sleep-for or accept-process-output (see Accepting Output).
- Emacs is also waiting when the command loop is reading input.
-
- Quitting is normally inhibited within a sentinel---otherwise, the effect of
- typing C-g at command level or to quit a user command would be unpredictable.
- If you want to permit quitting inside a sentinel, bind inhibit-quit to nil.
- See Quitting.
-
- All sentinels that do regexp searching or matching should save and restore the
- match data. Otherwise, a sentinel that runs during a call to sit-for might
- clobber the match data of the program that called sit-for. See Match Data.
-
- -- Function: set-process-sentinel process sentinel
- This function associates sentinel with process. If sentinel is nil, then the
- process will have no sentinel. The default behavior when there is no sentinel
- is to insert a message in the process's buffer when the process status changes.
-
- (defun msg-me (process event)
- (princ
- (format "Process: %s had the event `%s'" process event)))
- (set-process-sentinel (get-process "shell") 'msg-me)
- => msg-me
- (kill-process (get-process "shell"))
- -| Process: #<process shell> had the event `killed'
- => #<process shell>
-
- -- Function: process-sentinel process
- This function returns the sentinel of process, or nil if it has none.
-
- -- Function: waiting-for-user-input-p
- While a sentinel or filter function is running, this function returns non-nil
- if Emacs was waiting for keyboard input from the user at the time the sentinel
- or filter function was called, nil if it was not.
-
-
- ΓòÉΓòÉΓòÉ 35.9. Subprocess Functions for VMS ΓòÉΓòÉΓòÉ
-
- The ordinary subprocess functions do not work on VMS in version 18. Instead,
- these functions are available.
-
- -- Function: default-subprocess-input-handler
- This function is the default input handler for input from spawned subprocesses.
-
- -- Function: spawn-subprocess integer &optional filter sentinel
- This function spawns an asynchronous VMS subprocess for command processing.
- The arguments are integer, an integer to identify the subprocess in future
- operations; filter, a function to be called when output arrives from the
- subprocess; and sentinel, a function to be called when the subprocess
- terminates.
-
- If filter is nil, output is inserted in the current buffer. If sentinel is
- nil, nothing special is done when the subprocess terminates.
-
- When the filter is called, it receives two arguments; integer to identify the
- process, and a string containing the output.
-
- When the sentinel is called, it receives just one argument, integer.
-
- -- Function: send-command-to-subprocess integer command
- This function sends the string command to a VMS subprocess numbered integer.
-
- -- Function: stop-subprocess integer
- This function terminates the VMS subprocess numbered integer.
-
- In version 19, these functions have been eliminated, and the ordinary
- subprocess functions are implemented on VMS.
-
-
- ΓòÉΓòÉΓòÉ 35.10. TCP ΓòÉΓòÉΓòÉ
-
- Emacs Lisp programs can open TCP connections to other processes on the same
- machine or other machines. A network connection is handled by Lisp much like a
- subprocess, and is represented by a process object. However, the process you
- are communicating with is not a child of the Emacs process, so you can't kill
- it or send it signals. All you can do is send and receive data.
- delete-process closes the connection, but does not kill the process at the
- other end of it.
-
- You can distinguish process objects representing network connections from
- those representing subprocesses with the process-status function.
-
- -- Function: open-network-stream name buffer-or-name host service
- This function opens a TCP connection for a service to a host. It returns a
- process object to represent the connection.
-
- The name argument specifies the name for the process object. It is modified as
- necessary to make it unique.
-
- The buffer-or-name argument is the buffer to associate with the connection.
- Output from the connection is inserted in the buffer, unless you specify a
- filter function to handle the output. If buffer-or-name is nil, it means that
- the connection is not associated with any buffer.
-
- The arguments host and service specify where to connect to; host is the host
- name (a string), and service is the name of the service desired (a string) or
- an integer specifying a port number to connect to.
-
-
- ΓòÉΓòÉΓòÉ 36. Operating System Interface ΓòÉΓòÉΓòÉ
-
- This chapter is about starting and getting out of Emacs, access to values in
- the operating system environment, and terminal input, output and flow control.
-
- See Building Emacs, for related information. See also Emacs Display, for
- additional operating system status information which pertain to the terminal
- and the screen.
-
-
- ΓòÉΓòÉΓòÉ 36.1. Starting Up Emacs ΓòÉΓòÉΓòÉ
-
- This section describes what Emacs does when it is started, and how you can
- customize these actions.
-
-
- ΓòÉΓòÉΓòÉ 36.1.1. Summary: Sequence of Actions at Start Up ΓòÉΓòÉΓòÉ
-
- The order of operations performed (in `startup.el') by Emacs when it is
- started up is as follows:
-
- 1. It loads `.emacs' unless `-q' was specified on command line. (This is not
- done in `-batch' mode.) `.emacs' is found in the user's home directory;
- the `-u' option can specify the user name whose home directory should be
- used.
-
- 2. It loads `default.el' unless inhibit-default-init is non-nil. (This is not
- done in `-batch' mode or if `-q' was specified on command line.)
-
- 3. It loads the terminal-specific Lisp file, if any, except when in batch
- mode.
-
- 4. It runs term-setup-hook.
-
- 5. It runs window-setup-hook.
-
- 6. It displays copyleft and nonwarranty, plus basic use information, unless
- the value of inhibit-startup-message is non-nil.
-
- This display is also inhibited in batch mode, and if the current buffer is
- not `*scratch*'.
-
- 7. It processes any remaining command line arguments.
-
- -- User Option: inhibit-startup-message
- This variable inhibits the initial startup messages (the nonwarranty, etc.).
- If it is non-nil, then the messages are not printed.
-
- This variable exists so you can set it in your personal init file, once you
- are familiar with the contents of the startup message. Do not set this
- variable in the init file of a new user, or in a way that affects more than one
- user, because that would prevent new users from receiving the information they
- are supposed to see.
-
-
- ΓòÉΓòÉΓòÉ 36.1.2. The Init File: .emacs ΓòÉΓòÉΓòÉ
-
- When you start Emacs, it normally attempts to load the file `.emacs' from your
- home directory. This file, if it exists, must contain Lisp code. It is called
- your init file. The command line switches `-q' and `-u' can be used to control
- the use of the init file; `-q' says not to load an init file, and `-u' says to
- load a specified user's init file instead of yours. See Entering Emacs.
-
- Emacs may also have a default init file, which is the library named
- `default.el'. Emacs finds the `default.el' file through the standard search
- path for libraries ( see How Programs Do Loading). The Emacs distribution does
- not have any such file; you may create one at your site for local
- customizations. If the default init file exists, it is loaded whenever you
- start Emacs, except in batch mode or if `-q' is specified. But your own
- personal init file, if any, is loaded first; if it sets inhibit-default-init to
- a non-nil value, then Emacs will not load the `default.el' file.
-
- If there is a great deal of code in your `.emacs' file, you should move it
- into another file named `something.el', byte-compile it (see Byte Compilation),
- and make your `.emacs' file load the other file using load (see Loading).
-
- See Init File Examples, for examples of how to make various commonly desired
- customizations in your `.emacs' file.
-
- -- User Option: inhibit-default-init
- This variable prevents Emacs from loading the default initialization library
- file for your session of Emacs. If its value is non-nil, then the default
- library is not loaded. The default value is nil.
-
-
- ΓòÉΓòÉΓòÉ 36.1.3. Terminal-Specific Initialization ΓòÉΓòÉΓòÉ
-
- Each terminal type can have its own Lisp library that Emacs will load when run
- on that type of terminal. For a terminal type named termtype, the library is
- called `term/termtype'. Emacs finds the file by searching the load-path
- directories as it does for other files, and trying the `.elc' and `.el'
- suffixes. Normally, terminal-specific Lisp library is located in
- `emacs/lisp/term', a subdirectory of the `emacs/lisp' directory in which most
- Emacs Lisp libraries are kept.
-
- The library's name is constructed by concatenating the value of the variable
- term-file-prefix and the terminal type. Normally, term-file-prefix has the
- value "term/"; changing this is not recommended.
-
- The usual purpose of a terminal-specific library is to define the escape
- sequences used by a terminal's function keys. See the file `term/vt100.el' for
- an example of a terminal-specific library.
-
- Function keys are handled by a two-level procedure. The first level is
- dependent on the specific type of terminal and maps Emacs's input sequences to
- the function keys that they represent. The second level is independent of
- terminal type and is customized by users; function keys are mapped into
- meanings at this level. The terminal-specific library handles the first level
- of the process and the library `keypad.el' handles the second level of mapping.
-
- When the name of the terminal type contains a hyphen, only the part of the
- name before the first hyphen is significant in choosing the library name.
- Thus, terminal types `aaa-48' and `aaa-30-rv' both use the `term/aaa' library.
- If necessary, the library can evaluate (getenv "TERM") to find the full name of
- the terminal type.
-
- Your `.emacs' file can prevent the loading of the terminal-specific library by
- setting term-file-prefix to nil. This feature is very useful when
- experimenting with your own peculiar customizations.
-
- You can also arrange to override some of the actions of the terminal-specific
- library by setting the variable term-setup-hook. If it is not nil, Emacs calls
- the value of the variable term-setup-hook as a function of no arguments at the
- end of Emacs initialization, after Emacs has already loaded both your `.emacs'
- file and any terminal-specific libraries. You can use this variable to define
- initializations for terminals that do not have their own libraries.
-
- -- Variable: term-file-prefix
- If the term-file-prefix variable is non-nil, Emacs loads a terminal-specific
- initialization file as follows:
-
- (load (concat term-file-prefix (getenv "TERM")))
-
- You may set the term-file-prefix variable to nil in your `.emacs' file if you
- do not wish to load the terminal-initialization file. To do this, put the
- following in your `.emacs' file: (setq term-file-prefix nil).
-
- -- Variable: term-setup-hook
- The value of this variable is either nil or a function to be called by Emacs
- after loading your `.emacs' file, the default initialization file (if any) and
- after loading terminal-specific Lisp code. The function is called with no
- arguments.
-
- You can use term-setup-hook to override the definitions made by a
- terminal-specific file.
-
- See also window-setup-hook in Window Systems.
-
-
- ΓòÉΓòÉΓòÉ 36.1.4. Command Line Arguments ΓòÉΓòÉΓòÉ
-
- You can use command line arguments to request various actions when you start
- Emacs. Since you do not need to start Emacs more than once per day, and will
- often leave your Emacs session running longer than that, command line arguments
- are hardly ever used. As a practical matter, it is best to avoid making the
- habit of using them, since this habit would encourage you to kill and restart
- Emacs unnecessarily often. These options exist for two reasons: to be
- compatible with other editors (for invocation by other programs) and to enable
- shell scripts to run specific Lisp programs.
-
- -- Function: command-line
- This function parses the command line which Emacs was called with, processes
- it, loads the user's `.emacs' file and displays the initial nonwarranty
- information, etc.
-
- -- Variable: command-line-processed
- The value of this variable is t once the command line has been processed.
-
- If you redump Emacs by calling dump-emacs, you must set this variable to nil
- first in order to cause the new dumped Emacs to process its new command line
- arguments.
-
- -- Variable: command-switch-alist
- The value of this variable is an alist of user-defined command-line options and
- associated handler functions. This variable exists so you can add elements to
- it.
-
- A command line option is an argument on the command line of the form:
-
- -option
-
- The elements of the command-switch-alist look like this:
-
- (option . handler-function)
-
- For each element, the handler-function receives the switch name as its sole
- argument.
-
- In some cases, the option is followed in the command line by an argument. In
- these cases, the handler-function can find all the remaining command-line
- arguments in the variable command-line-args-left. (The entire list of
- command-line arguments is in command-line-args.)
-
- The command line arguments are parsed by the command-line-1 function in the
- `startup.el' file. See also Command Line Switches and Arguments.
-
- -- Variable: command-line-args
- The value of this variable is the arguments passed by the shell to Emacs, as a
- list of strings.
-
-
- ΓòÉΓòÉΓòÉ 36.2. Getting out of Emacs ΓòÉΓòÉΓòÉ
-
- There are two ways to get out of Emacs: you can kill the Emacs job, which
- exits permanently, or you can suspend it, which permits you to reenter the
- Emacs process later. As a practical matter, you seldom kill Emacs---only when
- you are about to log out. Suspending is much more common.
-
-
- ΓòÉΓòÉΓòÉ 36.2.1. Killing Emacs ΓòÉΓòÉΓòÉ
-
- Killing Emacs means ending the execution of the Emacs process. It will return
- to its superior process.
-
- All the information in the Emacs process, aside from files that have been
- saved, is lost when the Emacs is killed. Because killing Emacs inadvertently
- can lose a lot of work, Emacs will query for confirmation before actually
- terminating if you have buffers that need saving or subprocesses that are
- running.
-
- -- Function: kill-emacs &optional no-query
- This function exits the Emacs process and kills it.
-
- Normally, if there are modified files or if there are running processes,
- kill-emacs asks the user for confirmation before exiting. However, if no-query
- is supplied and non-nil, then Emacs exits without confirmation.
-
- If no-query is an integer, then it is used as the exit status of the Emacs
- process. (This is useful primarily in batch operation; see Batch Mode.)
-
- If no-query is a string, its contents are stuffed into the terminal input
- buffer so that the shell (or whatever program next reads input) can read them.
-
- -- Variable: kill-emacs-hook
- The value of the kill-emacs-hook variable is either nil or is that of a
- function to be called by kill-emacs. The hook is called before anything else
- is done by kill-emacs.
-
-
- ΓòÉΓòÉΓòÉ 36.2.2. Suspending Emacs ΓòÉΓòÉΓòÉ
-
- Suspending Emacs means stopping Emacs temporarily and returning control to its
- superior process, which is usually the shell. This allows you to resume
- editing later in the same Emacs process, with the same buffers, the same kill
- ring, the same undo history, and so on. To resume Emacs, use the appropriate
- command in the parent shell---most likely fg.
-
- Some operating systems do not support suspension of jobs; on these systems,
- ``suspension'' actually creates a new shell temporarily as a subprocess of
- Emacs. Then you would exit the shell to return to Emacs.
-
- Suspension is not useful with window systems such as X Windows, because the
- Emacs job may not have a parent that can resume it again, and in any case you
- can give input to some other job such as a shell merely by moving to a
- different window. Therefore, suspending is not allowed under X Windows.
-
- -- Function: suspend-emacs string
- This function stops Emacs and returns to the superior process. It returns
- nil.
-
- If string is non-nil, its characters are sent to be read as terminal input by
- Emacs's superior shell. The characters in string will not be echoed by the
- superior shell; just the results will appear.
-
- Before suspending, Emacs examines the symbol suspend-hook. If it is bound,
- and its value is non-nil, then the value is called as a function of no
- arguments. If the function returns non-nil, then suspend-emacs returns
- immediately and suspension does not occur.
-
- After Emacs resumes, the symbol suspend-resume-hook is examined. If it is
- bound and non-nil, then the value is called as a function of no arguments.
-
- The next redisplay after resumption will redraw the entire screen, unless
- no-redraw-on-reenter is set (see Screen Attributes).
-
- In the following example, note that `pwd' is not echoed after Emacs is
- suspended. But it is read and executed by the shell.
-
- (suspend-emacs)
- => nil
-
- (setq suspend-hook
- (function (lambda ()
- (not (y-or-n-p "Really suspend? ")))))
- => (lambda nil (not (y-or-n-p "Really suspend? ")))
- (setq suspend-resume-hook
- (function (lambda () (message "Resumed!"))))
- => (lambda nil (message "Resumed!"))
- (suspend-emacs "pwd")
- => nil
- ---------- Buffer: Minibuffer ----------
- Really suspend? y
-
- ---------- Parent Shell ----------
- lewis@slug[23] % /user/lewis/manual
- lewis@slug[24] % fg
-
- ---------- Echo Area ----------
- Resumed!
-
- -- Variable: suspend-hook
- The value of the suspend-hook variable, if not nil, is called as a function
- with no arguments by suspend-emacs before Emacs is actually suspended. If the
- function returns non-nil, then suspension does not take place.
-
- -- Variable: suspend-resume-hook
- The value of the suspend-resume-hook variable, if not nil, is called as a
- function with no arguments after resumption of an Emacs session that was
- suspended with suspend-emacs.
-
-
- ΓòÉΓòÉΓòÉ 36.3. Operating System Environment ΓòÉΓòÉΓòÉ
-
- Emacs provides access to variables in the operating system environment through
- various functions. These variables include the name of the system, the user's
- uid, and so on.
-
- -- Variable: system-type
- The value of this variable is a symbol indicating the type of operating system
- Emacs is operating on. Here is a table of the symbols for the operating
- systems that Emacs can run on up to version 18.51.
-
- berkeley-unix
- Berkeley BSD 4.1, 4.2, or 4.3.
-
- hpux
- Hewlett-Packard operating system, version 5, 6, or 7.
-
- silicon-graphics-unix
- Silicon Graphics Iris 3.5 or 3.6.
-
- rtu
- RTU 3.0, UCB universe.
-
- unisoft-unix
- UniSoft's UniPlus 5.0 or 5.2.
-
- usg-unix-v
- AT&T's System V.0, System V Release 2.0, 2.2, or 3.
-
- vax-vms
- VMS VMS version 4 or 5.
-
- xenix
- SCO Xenix 386 Release 2.2.
-
- We do not wish to add new symbols to make finer distinctions unless it is
- absolutely necessary! In fact, it would be nice to eliminate a couple of
- possibilities in the future.
-
- -- Function: getenv var
- This function returns the value of the environment variable var, as a string.
-
- (getenv "USER")
- => "lewis"
-
- lewis@slug[10] % printenv
- PATH=.:/user/lewis/bin:/usr/bin:/usr/local/bin
- USER=lewis
- TERM=ibmapa16
- SHELL=/bin/csh
- HOME=/user/lewis
-
- -- Function: user-login-name
- This function returns the name under which the user is logged in. This is
- based on the effective uid, not the real uid.
-
- (user-login-name)
- => "lewis"
-
- -- Function: user-real-login-name
- This function returns the name under which the user logged in. This is based
- on the real uid, not the effective uid. This differs from user-login-name only
- when running with the setuid bit.
-
- -- Function: user-full-name
- This function returns the full name of the user.
-
- (user-full-name)
- => "Bil Lewis"
-
- -- Function: user-real-uid
- This function returns the real uid of the user.
-
- (user-real-uid)
- => 19
-
- -- Function: user-uid
- This function returns the effective uid of the user.
-
- -- Function: system-name
- This function returns the name of the machine you are running on.
-
- (system-name)
- => "prep.ai.mit.edu"
-
- -- Function: current-time-string
- This function returns the current time and date as a humanly-readable string.
- The format of the string is unvarying; the number of characters used for each
- part is always the same, so you can reliably use substring to extract pieces of
- it. However, it would be wise to count the characters from the beginning of
- the string rather than from the end, as additional information describing the
- time zone may be added in version 19.
-
- (current-time-string)
- => "Wed Oct 14 22:21:05 1987"
-
- -- Function: load-average
- This function returns the current 1 minute, 5 minute and 15 minute load
- averages in a list. The values are integers that are 100 times the system load
- averages. (The load averages indicate the number of processes trying to run.)
-
- (load-average)
- => (169 48 36)
-
- lewis@rocky[5] % uptime
- 11:55am up 1 day, 19:37, 3 users, load average: 1.69, 0.48, 0.36
-
- -- Function: setprv privilege-name &optional setp getprv
- This function sets or resets a VMS privilege. (It does not exist on Unix.)
- The first arg is the privilege name, as a string. The second argument, setp,
- is t or nil, indicating whether the privilege is to be turned on or off. Its
- default is nil. The function returns t if success, nil if not.
-
- If the third argument, getprv, is non-nil, setprv does not change the
- privilege, but returns t or nil indicating whether the privilege is currently
- enabled.
-
-
- ΓòÉΓòÉΓòÉ 36.4. Terminal Input ΓòÉΓòÉΓòÉ
-
- The terminal input functions and variables keep track of or manipulate
- terminal input.
-
- See Emacs Display, for related functions.
-
- -- Function: recent-keys
- This function returns a string comprising the last 100 characters read from
- the terminal. These are the last 100 characters read by Emacs, no exceptions.
-
- (recent-keys)
- => "erminal. These are the last 100 characters read by Emacs, no
- exceptions.
-
- @example
- (recent-keys)^U^X^E"
-
- Here the string `@example' is a Texinfo command that was inserted in the source
- file for the manual, and `^U^X^E' are the characters that were typed to
- evaluate the expression (recent-keys).
-
- -- Command: open-dribble-file filename
- This function opens a dribble file named filename. When a dribble file is
- open, Emacs copies all keyboard input characters to that file. (The contents
- of keyboard macros are not typed on the keyboard so they are not copied to the
- dribble file.)
-
- You close the dribble file by calling this function with an argument of "".
- The function always returns nil.
-
- This function is normally used to record the input necessary to trigger an
- Emacs bug, for the sake of a bug report.
-
- (open-dribble-file "$j/dribble")
- => nil
-
- See also the open-termscript function (see Terminal Output).
-
- -- Function: set-input-mode interrupt flow quit-char
- This function sets the mode for reading keyboard input. If interrupt is
- non-null, then Emacs uses input interrupts. If it is nil, then it uses cbreak
- mode.
-
- If flow is non-nil, then Emacs uses xon/xoff (C-q, C-s) flow control for
- output to terminal. This has no effect except in cbreak mode. See Flow
- Control.
-
- The normal setting is system dependent. Some systems always use cbreak mode
- regardless of what is specified.
-
- If quit-char is non-nil, it specifies the character to use for quitting.
- Normally this is 7, the code for C-g. See Quitting.
-
- -- Variable: meta-flag
- This variable tells Emacs whether to treat the 0200 bit in keyboard input as
- the Meta bit. nil means no, and anything else means yes. In version 19,
- meta-flag will be a function instead of a variable.
-
- -- Variable: keyboard-translate-table
- This variable defines the translate table for keyboard input. This allows the
- user to redefine the keys on the keyboard without changing any command
- bindings. Its value must be a string or nil.
-
- If keyboard-translate-table is a string, then each character read from the
- keyboard is looked up in this string and the character in the string is used
- instead. If the string is of length n, character codes n and up are
- untranslated.
-
- In the example below, keyboard-translate-table is set to a string of 128
- characters. Then the characters C-s and C-\ are swapped and the characters C-q
- and C-^ are swapped. After executing this function, typing C-\ has all the
- usual effects of typing C-s, and vice versa. (See Flow Control for more
- information on this subject.)
-
- (defun evade-flow-control ()
- "Replace C-s with C-\ and C-q with C-^."
- (interactive)
- (let ((the-table (make-string 128 0)))
- (let ((i 0))
- (while (< i 128)
- (aset the-table i i)
- (setq i (1+ i))))
-
- ;; Swap C-s and C-\.
- (aset the-table ?\034 ?\^s)
- (aset the-table ?\^s ?\034)
- ;; Swap C-q and C-^.
- (aset the-table ?\036 ?\^q)
- (aset the-table ?\^q ?\036)
-
- (setq keyboard-translate-table the-table)))
-
- Note that this translation is the first thing that happens after a character is
- read from the terminal. As a result, record-keeping features such as
- recent-keys and open-dribble-file record the translated characters.
-
-
- ΓòÉΓòÉΓòÉ 36.5. Terminal Output ΓòÉΓòÉΓòÉ
-
- The terminal output functions send or keep track of output sent from the
- computer to the terminal. The baud-rate function tells you what Emacs thinks
- is the output baud rate of the terminal.
-
- -- Function: baud-rate
- This function returns the output baud rate of the terminal.
-
- (baud-rate)
- => 9600
-
- If you are running across a network, and different parts of the network work
- at different baud rates, the value returned by Emacs may be different from the
- value used by your local terminal. Some network protocols communicate the
- local terminal speed to the remote machine, so that Emacs and other programs
- can get the proper value, but others do not. If the machine where Emacs is
- running has the wrong speed setting, you can specify the right speed using the
- stty program. However, you will have to start Emacs afresh to make this take
- effect.
-
- *Note:* In version 19, baud-rate is a variable so that you can change it
- conveniently within Emacs.
-
- -- Function: send-string-to-terminal string
- This function sends string to the terminal without alteration. Control
- characters in string will have terminal-dependent effects.
-
- One use of this function is to define function keys on terminals that have
- downloadable function key definitions. For example, this is how on certain
- terminals to define function key 4 to move forward four characters (by
- transmitting the characters C-u C-f to the computer):
-
- (send-string-to-terminal "\eF4\^U\^F")
- => nil
-
- -- Command: open-termscript filename
- This function is used to open a termscript file that will record all the
- characters sent by Emacs to the terminal. It returns nil. Termscript files
- are useful for investigating problems where Emacs garbles the screen, problems
- which are due to incorrect termcap entries or to undesirable settings of
- terminal options more often than actual Emacs bugs. Once you are certain which
- characters were actually output, you can determine reliably whether they
- correspond to the termcap specifications in use.
-
- See also open-dribble-file in Terminal Input.
-
- (open-termscript "../junk/termscript")
- => nil
-
-
- ΓòÉΓòÉΓòÉ 36.6. Flow Control ΓòÉΓòÉΓòÉ
-
- This section attempts to answer the question ``Why does Emacs choose to use
- flow-control characters in its command character set?'' For a second view on
- this issue, read the comments on flow control in the `emacs/INSTALL' file from
- the distribution; for help with termcaps and DEC terminal concentrators, see
- `emacs/etc/TERMS'.
-
- At one time, most terminals did not need flow control. This meant that the
- choice of C-s and C-q as command characters was reasonable. Emacs, for economy
- of keystrokes and portability, chose to use the control characters in the ASCII
- character set, and tried to make the assignments mnemonic (thus, C-s for search
- and C-q for quote).
-
- Later, some terminals were introduced which used these characters for flow
- control. They were not very good terminals, so Emacs maintainers did not pay
- attention. In later years, the practice became widespread among terminals, but
- by this time it was usually an option. And the majority of users, who can turn
- flow control off, were unwilling to switch to less mnemonic key bindings for
- the sake of flow control.
-
- So which usage is ``right'', Emacs's or that of some terminal and concentrator
- manufacturers? This is a rhetorical (or religious) question; it has no simple
- answer.
-
- One reason why we are reluctant to cater to the problems caused by C-s and C-q
- is that they are gratuitous. There are other techniques (albeit less common in
- practice) for flow control that preserve transparency of the character stream.
- Note also that their use for flow control is not an official standard.
- Interestingly, on the model 33 teletype with a paper tape punch (which is very
- old), C-s and C-q were sent by the computer to turn the punch on and off!
-
- GNU Emacs (version 18.48 and later) provides several options for coping with
- terminals or front-ends that insist on using flow control characters. Listed
- in estimated order of preference, these options are as follows:
-
- 1. Have Emacs run in cbreak mode with the kernel handling flow control. Issue
- (set-input-mode nil t) from `.emacs'. After doing this, it is necessary to
- find other keys to bind to the commands isearch-forward and quoted-insert.
- The usual nominees are C-^ and C-\. There are two ways to get this effect:
-
- a. Use the keyboard-translate-table to cause C-^ and C-\ to be received by
- Emacs as though C-s and C-q were typed. Emacs (except at its very
- lowest level) never knows that the characters typed were anything but
- C-s and C-q, so the use of these keys inside isearch-forward still
- works---typing C-^ while incremental searching will move the cursor to
- the next match, etc. For example:
-
- (setq keyboard-translate-table (make-string 128 0))
- (let ((i 0))
- (while (< i 128)
- (aset keyboard-translate-table i i)
- (setq i (1+ i))))
-
- ;; Swap C-s and C-\.
- (aset the-table ?\034 ?\^s)
- (aset the-table ?\^s ?\034)
- ;; Swap C-q and C-^.
- (aset the-table ?\036 ?\^q)
- (aset the-table ?\^q ?\036)))
-
- b. Simply rebind the keys C-^ and C-\ to isearch-forward and quoted-insert.
- To use the new keys to repeat searches, it is necessary to set
- search-repeat-char to C-^ as well.
-
- 2. Don't use cbreak mode, but cause C-s and C-q to be bound to a null command.
- The problem with this solution is that the flow control characters were
- probably sent because whatever sent them is falling behind on the
- characters being sent to it. The characters that find their way to the
- terminal screen will not in general be those that are intended. Also, it
- will be be necessary to find other keys to bind to isearch-forward and
- quoted-insert; see the previous alternative.
-
- Here is a suitable null command:
-
- (defun noop ()
- "Do nothing; return nil."
- (interactive))
-
- 3. Don't use cbreak mode, and unset the C-s and C-q keys with the
- global-unset-key function. This is similar to the previous alternative,
- except that the flow control characters will probably cause beeps or
- visible bells.
-
- Note that if the terminal is the source of the flow control characters and
- kernel flow control handling is enabled, you probably will not have to send
- padding characters as specified in a termcap or terminfo entry. In this
- case, it may be possible to customize a termcap entry to provide better
- Emacs performance on the assumption that flow control is in use. This
- effect can also be simulated by announcing (with stty or its equivalent)
- that the terminal is running at a very slow speed, provided you are
- communicating across a network so that stty does not actually try to change
- the line speed.
-
-
- ΓòÉΓòÉΓòÉ 36.7. Batch Mode ΓòÉΓòÉΓòÉ
-
- The command line option `-batch' causes Emacs to run noninteractively. In
- this mode, Emacs does not read commands from the terminal, it does not alter
- the terminal modes, and it does not expect to be outputting to an erasable
- screen. The idea is that you will specify Lisp programs to run; when they are
- finished, Emacs should exit. The way to specify the programs to run is with `-l
- file', which causes the library named file to be loaded, and `-f function',
- which causes function to be called with no arguments.
-
- Any Lisp program output that would normally go to the echo area, either using
- message or using prin1, etc., with t as the stream, will actually go to Emacs's
- standard output descriptor when in batch mode. Thus, Emacs behaves much like a
- noninteractive application program. (The echo area output that Emacs itself
- normally generates, such as command echoing, is suppressed entirely.)
-
- -- Variable: noninteractive
- This variable is non-nil when Emacs is running in batch mode.
-
-
- ΓòÉΓòÉΓòÉ 37. Emacs Display ΓòÉΓòÉΓòÉ
-
- This chapter describes a number of features related to the display that Emacs
- presents to the user.
-
-
- ΓòÉΓòÉΓòÉ 37.1. Refreshing the Screen ΓòÉΓòÉΓòÉ
-
- -- Command: redraw-display
- This function clears the screen and redraws what is supposed to appear on it.
-
-
- ΓòÉΓòÉΓòÉ 37.2. Screen Attributes ΓòÉΓòÉΓòÉ
-
- The screen attribute functions describe and define the characteristics of the
- terminal.
-
- -- Function: screen-height
- This function returns the number of lines on the screen that are available for
- display.
-
- (screen-height)
- => 50
-
- -- Function: screen-width
- This function returns the number of columns on the screen that are available
- for display.
-
- (screen-width)
- => 80
-
- -- Function: set-screen-height lines &optional not-actual-size
- This function declares that the terminal can display lines lines. The sizes of
- existing windows will be altered proportionally to fit.
-
- If not-actual-size is non-nil, then Emacs will display lines lines of output,
- but will not change its value for the actual height of the screen. Knowing the
- correct actual size may be necessary for correct cursor positioning.
-
- If lines is different from what it was previously, then the entire screen is
- cleared and redisplayed using the new size.
-
- This function returns nil.
-
- -- Function: set-screen-width columns &optional not-actual-size
- This function declares that the terminal can display columns columns. The
- details are as in set-screen-height.
-
- -- Variable: no-redraw-on-reenter
- This variable controls whether Emacs redraws the entire screen after it has
- been suspended and resumed. Non-nil means yes, nil means no. On most
- terminals, it is necessary to redraw. Not redrawing is useful if the terminal
- can remember and restore the Emacs screen contents.
-
- -- Variable: inverse-video
- This variable controls whether Emacs uses inverse video for all text on the
- screen. Non-nil means yes, nil means no. The default is nil.
-
- -- User Option: mode-line-inverse-video
- This variable controls the use of inverse video for mode lines. If it is
- non-nil, then mode lines are displayed in inverse video (or another suitable
- display mode). Otherwise, mode lines are displayed normal, just like the rest
- of the screen. The default is t.
-
-
- ΓòÉΓòÉΓòÉ 37.3. Truncation ΓòÉΓòÉΓòÉ
-
- When a line of text extends beyond the right edge of a window, the line can
- either be truncated or continued on the next line. When a line is truncated,
- this is shown with a `$' in the rightmost column of the window. When a line is
- continued or ``wrapped'' onto the next line, this is shown with a `\' on the
- rightmost column of the window. The additional screen lines used to display a
- long text line are called continuation lines. (Note that wrapped lines are not
- filled; filling has nothing to do with truncation and continuation. See
- Filling.)
-
- -- User Option: truncate-lines
- This buffer-local variable controls how Emacs displays lines that extend
- beyond the right edge of the window. If it is non-nil, then Emacs does not
- display continuation lines; but rather each line of text will take exactly one
- screen line, and a dollar sign will be shown at the edge of any line that
- extends to or beyond the edge of the window. The default is nil.
-
- If the variable truncate-partial-width-windows is non-nil, then truncation is
- used for windows that are not the full width of the screen, regardless of the
- value of truncate-lines.
-
- -- Variable: default-truncate-lines
- This variable is the default value for truncate-lines in buffers that do not
- override it.
-
- -- User Option: truncate-partial-width-windows
- This variable determines how lines that are too wide to fit on the screen are
- displayed in side-by-side windows ( see Splitting Windows). If it is non-nil,
- then wide lines are truncated (with a `$' at the end of the line); otherwise
- they are wrapped (with a `\' at the end of the line).
-
-
- ΓòÉΓòÉΓòÉ 37.4. The Echo Area ΓòÉΓòÉΓòÉ
-
- The echo area is used for displaying messages made with the message primitive,
- and for echoing keystrokes. It is not the same as the minibuffer, despite the
- fact that the minibuffer appears (when active) in the same place on the screen
- as the echo area. The GNU Emacs Manual specifies the rules for resolving
- conflicts between the echo area and the minibuffer for use of that screen space
- (see The Minibuffer).
-
- You can write output in the echo area by using the Lisp printing funtions with
- t as the stream (see Output Functions), or as follows:
-
- -- Function: message string &rest arguments
- This function prints a one-line message in the echo area. The argument string
- is similar to a C language printf control string. See format in String
- Conversion, for the details on the conversion specifications. message returns
- the constructed string.
-
- (message "Minibuffer depth is %d." (minibuffer-depth))
- => "Minibuffer depth is 0."
-
- ---------- Echo Area ----------
- Minibuffer depth is 0.
- ---------- Echo Area ----------
-
- -- Variable: cursor-in-echo-area
- This variable controls where the cursor is positioned when a message is
- displayed in the echo area. If it is non-nil, then the cursor appears at the
- end of the message. Otherwise, the cursor appears at point---not in the echo
- area at all.
-
- The value is normally nil except when bound to t for brief periods of time.
-
-
- ΓòÉΓòÉΓòÉ 37.5. Selective Display ΓòÉΓòÉΓòÉ
-
- Selective display is a class of minor modes in which specially marked lines do
- not appear on the screen, or in which highly indented lines do not appear.
-
- The first variant, explicit selective display, is designed for use in a Lisp
- program. The program controls which lines are hidden by altering the text.
- Outline mode uses this variant. In the second variant, the choice of lines to
- hide is made automatically based on indentation. This variant is designed as a
- user-level feature.
-
- The way you control explicit selective display is by replacing a newline
- (control-j) with a control-m. The text which was formerly a line following
- that newline is now invisible. Strictly speaking, it is no longer a separate
- line, since only newlines can separate lines; it is now part of the previous
- line.
-
- On its own, selective display does not affect editing commands. For example,
- C-f (forward-char) moves point unhesitatingly into invisible space. However,
- the replacement of newline characters with carriage return characters affects
- some editing commands. For example, next-line skips invisible lines, since it
- searches only for newlines. Modes that use selective display can also define
- commands that take account of the newlines, or which make parts of the text
- visible or invisible.
-
- When you write a selectively displayed buffer into a file, all the control-m's
- are replaced by their original newlines. This means that when you next read in
- the file, it looks OK, with nothing invisible. Selective display is an effect
- that is seen only in Emacs.
-
- -- Variable: selective-display
- This buffer-local variable enables selective display. This means that lines,
- or portions of lines, may be made invisible.
-
- o If the value of selective-display is t, then any portion of a line that
- follows a control-m will not be displayed.
-
- o If the value of selective-display is a positive integer, then lines that
- start with more than selective-display columns of indentation will not be
- displayed.
-
- When some portion of a buffer is invisible, the vertical movement commands
- operate as if that portion did not exist, allowing a single next-line command
- to skip any number of invisible lines. However, character movement commands
- (such as forward-char) will not skip the invisible portion, and it is possible
- (if tricky) to insert or delete parts of an invisible portion.
-
- In the examples below, what is shown is the display of the buffer foo, which
- changes with the value of selective-display. The contents of the buffer do not
- change.
-
- (setq selective-display nil)
- => nil
-
- ---------- Buffer: foo ----------
- 1 on this column
- 2on this column
- 3n this column
- 3n this column
- 2on this column
- 1 on this column
- ---------- Buffer: foo ----------
-
- (setq selective-display 2)
- => 2
-
- ---------- Buffer: foo ----------
- 1 on this column
- 2on this column
- 2on this column
- 1 on this column
- ---------- Buffer: foo ----------
-
- -- Variable: selective-display-ellipses
- If this buffer-local variable is non-nil, then Emacs displays `...' at the end
- of a line that is followed by invisible text. This example is a continuation of
- the previous one.
-
- (setq selective-display-ellipses t)
- => t
-
- ---------- Buffer: foo ----------
- 1 on this column
- 2on this column ...
- 2on this column
- 1 on this column
- ---------- Buffer: foo ----------
-
-
- ΓòÉΓòÉΓòÉ 37.6. Overlay Arrow ΓòÉΓòÉΓòÉ
-
- The overlay arrow is useful for directing the user's attention to a particular
- line in a buffer. For example, in the modes used for interface to debuggers,
- the overlay arrow indicates the current line of code about to be executed.
-
- -- Variable: overlay-arrow-string
- This variable holds the string to display as an arrow, or nil if the arrow
- feature is not in use.
-
- -- Variable: overlay-arrow-position
- This variable holds a marker which indicates where to display the arrow. It
- should point at the beginning of a line. The arrow text will be displayed at
- the beginning of that line, overlaying any text that would otherwise appear.
- Since the arrow is usually short, and the line usually begins with indentation,
- normally nothing significant is overwritten.
-
- The overlay string is displayed only in the buffer which this marker points
- into. Thus, only one buffer can have an overlay arrow at any given time.
-
-
- ΓòÉΓòÉΓòÉ 37.7. Temporary Displays ΓòÉΓòÉΓòÉ
-
- Temporary displays are used by commands to put output into a buffer and then
- present it to the user for perusal rather than for editing. Many of the help
- commands use this feature.
-
- -- Special Form: with-output-to-temp-buffer buffer-name forms...
- This function executes forms while arranging to insert any output they print
- into the buffer named buffer-name. The buffer is then shown in some window for
- viewing, displayed but not selected.
-
- The buffer is named by the string buffer-name, and it need not already exist.
- The argument buffer-name must be a string, not a buffer. The buffer is erased
- initially (with no questions asked), and it is marked as unmodified after
- with-output-to-temp-buffer exits.
-
- with-output-to-temp-buffer first binds standard-output to the buffer, then it
- evaluates the forms in forms. With standard-output rebound, any output
- directed there will naturally be inserted into that buffer. Only Lisp output
- directed to the stream standard-output is affected; screen display and messages
- in the echo area, although output in the general sense of the word, are not
- affected. See Output Functions.
-
- The value of the last form in forms is returned.
-
- ---------- Buffer: foo ----------
- This is the contents of foo.
- ---------- Buffer: foo ----------
-
- (with-output-to-temp-buffer "foo"
- (print 20)
- (print standard-output))
- => #<buffer foo>
-
- ---------- Buffer: foo ----------
- 20
-
- #<buffer foo>
-
- ---------- Buffer: foo ----------
-
- -- Variable: temp-buffer-show-hook
- The value of the temp-buffer-show-hook variable is either nil or is called as
- a function to display a help buffer. This variable is used by
- with-output-to-temp-buffer.
-
- -- Function: momentary-string-display string position &optional char message
- This function momentarily displays string in the current buffer at position
- (which is a character offset from the beginning of the buffer). The display
- remains until the next character is typed.
-
- If the next character the user types is char, Emacs ignores it. Otherwise,
- that character remains buffered for subsequent use as input. Thus, typing char
- will simply remove the string from the display, while typing (say) C-f will
- remove the string from the display and later (presumably) move point forward.
- The argument char is a space by default.
-
- The result of momentary-string-display is not useful.
-
- If message is non-nil, it is displayed in the echo area. If it is nil, then
- instructions to type char are displayed there, e.g., `Type RET to continue
- editing'.
-
- In this example, point is initially located at the beginning of the second
- line:
-
- ---------- Buffer: foo ----------
- This is the contents of foo.
- -!-This is the contents of foo.
- ---------- Buffer: foo ----------
-
- (momentary-string-display
- "******* Important Message! *******" (point) ?\r
- "Type RET when done reading")
- => t
-
- ---------- Buffer: foo ----------
- This is the contents of foo.
- ******* Important Message! *******This is the contents of foo.
- ---------- Buffer: foo ----------
-
- ---------- Echo Area ----------
- Type RET when done reading
-
- This function works by actually changing the text in the buffer. As a result,
- if you later undo in this buffer, you will see the message come and go.
-
-
- ΓòÉΓòÉΓòÉ 37.8. Waiting for Elapsed Time or Input ΓòÉΓòÉΓòÉ
-
- The waiting commands are designed to make Emacs wait for a certain amount of
- time to pass or until there is input. For example, you may wish to pause in
- the middle of a computation to allow the user time to view the display.
- sit-for performs a pause with an update of screen, while sleep-for performs a
- pause without updating the screen.
-
- -- Function: sit-for seconds
- This function performs redisplay (provided there is no pending input from the
- user), then waits seconds seconds, or until input is available. The result is
- t if sit-for waited the full time with no input arriving (see input-pending-p
- in Keyboard Input). Otherwise, nil is returned.
-
- Redisplay is always preempted if input arrives, and does not happen at all if
- input is available before it starts. Thus, there is no way to force screen
- updating if there is pending input; however, if there is no input pending, you
- can force an update with no delay by using (sit-for 0).
-
- The purpose of sit-for to give the user time to read text that you display.
-
- -- Function: sleep-for seconds
- This function simply pauses for seconds seconds without updating the display.
- It pays no attention to available input. It returns nil.
-
- Use sleep-for when you wish to guarantee a delay.
-
-
- ΓòÉΓòÉΓòÉ 37.9. Blinking ΓòÉΓòÉΓòÉ
-
- This section describes the mechanism by which Emacs shows a matching open
- parenthesis when the user inserts a close parenthesis.
-
- -- Variable: blink-paren-hook
- The value of this variable should be a function (of no arguments) to be called
- whenever a char with close parenthesis syntax is inserted. The value of
- blink-paren-hook may be nil, in which case nothing is done.
-
- *Note:* in version 18, this function is named blink-paren-hook, but since it is
- not called with the standard convention for hooks, it is being renamed to
- blink-paren-function in version 19.
-
- -- Variable: blink-matching-paren
- If this variable is nil, then blink-matching-open does nothing.
-
- -- Variable: blink-matching-paren-distance
- This variable specifies the maximum distance to scan for a matching parenthesis
- before giving up.
-
- -- Function: blink-matching-open
- This function is the default value of blink-paren-hook. It assumes that point
- follows a character with close parenthesis syntax and moves the cursor
- momentarily to the matching opening character. If that character is not
- already on the screen, then its context is shown by displaying it in the echo
- area. To avoid long delays, this function does not search farther than
- blink-matching-paren-distance characters.
-
- Here is an example of calling this function explicitly.
-
- (defun interactive-blink-matching-open ()
- "Indicate momentarily the start of sexp before point."
- (interactive)
- (let ((blink-matching-paren-distance (buffer-size))
- (blink-matching-paren t))
- (blink-matching-open)))
-
-
- ΓòÉΓòÉΓòÉ 37.10. Display of Control Characters ΓòÉΓòÉΓòÉ
-
- These variables affect the way certain characters are displayed on the screen.
- Since they change the number of columns the characters occupy, they also affect
- the indentation functions.
-
- -- User Option: ctl-arrow
- This buffer-local variable controls how control characters are displayed. If
- it is non-nil, they are displayed as an uparrow followed by the character:
- `^A'. If it is nil, they are displayed as a backslash followed by three octal
- digits: `\001'.
-
- -- Variable: default-ctl-arrow
- The value of this variable is the default value for ctl-arrow in buffers that
- do not override it. This is the same as (default-value 'ctl-arrow) (see
- Default Value).
-
- -- User Option: tab-width
- The value of this variable is the spacing between tab stops used for
- displaying tab characters in Emacs buffers. The default is 8. Note that this
- feature is completely independent from the user-settable tab stops used by the
- command tab-to-tab-stop. See Indent Tabs.
-
-
- ΓòÉΓòÉΓòÉ 37.11. Beeping ΓòÉΓòÉΓòÉ
-
- You can make Emacs ring a bell (or blink the screen) to attract the user's
- attention. Be conservative about how often you do this; frequent bells can
- become irritating. Also be careful not to use beeping alone when signaling an
- error is appropriate. (See Errors.)
-
- -- Function: ding &optional dont-terminate
- This function beeps, or flashes the screen (see visible-bell below). It also
- terminates any keyboard macro currently executing unless dont-terminate is
- non-nil.
-
- -- Function: beep &optional dont-terminate
- This is a synonym for ding.
-
- -- Variable: visible-bell
- This variable determines whether Emacs will try to flash the screen to
- represent a bell. Non-nil means yes, nil means no. This is effective only if
- the termcap entry for the terminal in use has the visible bell flag (`vb') set.
-
-
- ΓòÉΓòÉΓòÉ 37.12. Window Systems ΓòÉΓòÉΓòÉ
-
- Emacs works with several window systems, most notably X Windows. Note that
- both Emacs and the X Window System use the term ``window'', but use it
- differently. The entire Emacs screen is a single window as far as X Windows is
- concerned; the individual Emacs windows are not known to X Windows at all.
-
- -- Variable: window-system
- This variable tells Lisp programs what window system Emacs is running under.
- Its value should be a symbol such as x (if Emacs is running under X Windows) or
- nil (if Emacs is running on an ordinary terminal).
-
- -- Variable: window-system-version
- This variable distinguishes between different versions of the X Window System.
- Its value is 10 or 11 when using X Windows; nil otherwise.
-
- -- Variable: window-setup-hook
- The value of the window-setup-hook variable is either nil or a function for
- Emacs to call after loading your `.emacs' file and the default initialization
- file (if any), after loading terminal-specific Lisp code, and after calling
- term-setup-hook. window-setup-hook is called with no arguments.
-
- This hook is used for internal purposes: setting up communication with the
- window system, and creating the initial window. Users should not interfere
- with it.
-
-
- ΓòÉΓòÉΓòÉ 38. Tips and Standards ΓòÉΓòÉΓòÉ
-
- This chapter describes no additional features of Emacs Lisp. Instead it gives
- advice on making effective use of the features described in the previous
- chapters.
-
-
- ΓòÉΓòÉΓòÉ 38.1. Writing Clean Lisp Programs ΓòÉΓòÉΓòÉ
-
- Here are some tips for avoiding common errors in writing Lisp code intended
- for widespread use:
-
- o Since all global variables share the same name space, and all functions share
- another name space, you should choose a short word to distinguish your
- program from other Lisp programs. Then take care to begin the names of all
- global variables, constants, and functions with the chosen prefix. This
- helps avoid name conflicts.
-
- This recommendation applies even to names for traditional Lisp primitives
- that are not primitives in Emacs Lisp---even to cadr. Believe it or not,
- there is more than one plausible way to define cadr. Play it safe; append
- your name prefix to produce a name like foo-cadr or mylib-cadr instead.
-
- If one prefix is insufficient, your package may use two or three alternative
- common prefixes, so long as they make sense.
-
- o It is often useful to put a call to provide in each separate library program,
- at least if there is more than one entry point to the program.
-
- o If one file foo uses a macro defined in another file bar, foo should contain
- (require 'bar) before the first use of the macro. (And bar should contain
- (provide 'bar), to make the require work.) This will cause bar to be loaded
- when you byte-compile foo. Otherwise, you risk compiling foo without the
- necessary macro loaded, and that would produce compiled code that won't work
- right. See Compiling Macros.
-
- o If you define a major mode, make sure to run a hook variable using run-hooks,
- just as the existing major modes do. See Hooks.
-
- o Please do not define C-c letter as a key. These sequences are reserved for
- users; they are the *only* sequences reserved for users, so we cannot do
- without them.
-
- Everything in Emacs that used to define such sequences has been changed,
- which was a lot of work. Abandoning this convention would waste that work
- and inconvenience the users.
-
- o It is a bad idea to define aliases for the Emacs primitives. Use the standard
- names instead.
-
- o Redefining an Emacs primitive is an even worse idea. It may do the right
- thing for a particular program, but there is no telling what other programs
- might break as a result.
-
- o If a file does replace any of the functions or library programs of standard
- Emacs, prominent comments at the beginning of the file should say which
- functions are replaced, and how the behavior of the replacements differs from
- that of the originals.
-
- o If a file requires certain standard library programs to be loaded beforehand,
- then the comments at the beginning of the file should say so.
-
- o Don't use next-line or previous-line in programs; nearly always, forward-line
- is more convenient as well as more predictable and robust. See Text Lines.
-
- o Don't use functions that set the mark in your Lisp code (unless you are
- writing a command to set the mark). The mark is a user-level feature, so it
- is incorrect to change the mark except to supply a value for the user's
- benefit. See The Mark.
-
- In particular, don't use these functions:
-
- - beginning-of-buffer, end-of-buffer
-
- - replace-string, replace-regexp
-
- If you just want to move point, or replace a certain string, without any of
- the other features intended for interactive users, you can replace these
- functions with one or two lines of simple Lisp code.
-
- o The recommended way to print a message in the echo area is with the message
- function, not princ. See The Echo Area.
-
- o When you encounter an error condition, call the function error (or signal).
- The function error does not return. See Signaling Errors.
-
- Do not use message, throw, sleep-for, or beep to report errors.
-
- o Avoid using recursive edits. Instead, do what the Rmail w command does: use
- a new local keymap that contains one command defined to switch back to the
- old local keymap. Or do what the edit-options command does: switch to
- another buffer and let the user switch back at will. See Recursive Editing.
-
- o In some other systems there is a convention of choosing variable names that
- begin and end with `*'. We don't use that convention in Emacs Lisp, so
- please don't use it in your library. The users will find Emacs more coherent
- if all libraries use the same conventions.
-
- o Indent each function with C-M-q (indent-sexp) using the default indentation
- parameters.
-
- o Don't make a habit of putting close-parentheses on lines by themselves; Lisp
- programmers find this disconcerting. Once in a while, when there is a
- sequence of many consecutive close-parentheses, it may make sense to split
- them in one or two significant places.
-
- o Please put a copyright notice on the file if you give copies to anyone. Use
- the same lines that appear at the top of the Lisp files in Emacs itself. If
- you have not signed papers to assign the copyright to the Foundation, then
- place your name in the copyright notice in place of the Foundation's name.
-
-
- ΓòÉΓòÉΓòÉ 38.2. Tips for Making Compiled Code Fast ΓòÉΓòÉΓòÉ
-
- Here are ways of improving the execution speed of byte-compiled lisp programs.
-
- o Use iteration rather than recursion whenever possible. Function calls are
- slow in Emacs Lisp even when a compiled function is calling another compiled
- function.
-
- o Using the primitive list-searching functions memq, assq or assoc is even
- faster than explicit iteration. It may be worth rearranging a data structure
- so that one of these primitive search functions can be used.
-
- For example, if you want to search a list of strings for a string equal to a
- given one, you can use an explicit loop:
-
- (let ((tail list))
- (while (and tail (not (string= string (car tail))))
- (setq tail (cdr tail))))
-
- However, if you use a list of elements of the form (string), such as (("foo")
- ("#&") ("bar")), then you can search it with assoc:
-
- (assoc string list)
-
- The latter runs entirely in C code, so it is much faster.
-
- o Certain built-in functions are handled specially by the byte compiler
- avoiding the need for an ordinary function call. It is a good idea to use
- these functions rather than alternatives. To see whether a function is
- handled specially by the compiler, examine its byte-compile property. If the
- property is non-nil, then the function is handled specially.
-
- For example, the following input will show you that aref is compiled
- specially (see Array Functions) while elt is not (see Sequence Functions):
-
- (get 'aref 'byte-compile)
- => byte-compile-two-args
-
- (get 'elt 'byte-compile)
- => nil
-
- o Often macros result in faster execution than functions. For example, the
- following macro and the following function have the same effect when called,
- but code using the macro runs faster because it avoids an extra call to a
- user-defined function:
-
- (defmacro fast-cadr (x) (list 'car (list 'cdr x)))
-
- (defun slow-cadr (x) (car (cdr x)))
-
-
- ΓòÉΓòÉΓòÉ 38.3. Tips for Documentation Strings ΓòÉΓòÉΓòÉ
-
- Here are some tips for the writing of documentation strings.
-
- o Every command, function or variable intended for users to know about should
- have a documentation string.
-
- o An internal subroutine of a Lisp program need not have a documentation
- string, and you can save space by using a comment instead.
-
- o The first line of the documentation string should consist of one or two
- complete sentences which stand on their own as a summary. In particular,
- start the line with a capital letter and end with a period.
-
- The documentation string can have additional lines which expand on the
- details of how to use the function or variable. The additional lines should
- be made up of complete sentences also, but they may be filled if that looks
- good.
-
- o Do not start or end a documentation string with whitespace.
-
- o Format the documentation string so that it fits in an Emacs window on an 80
- column screen. It is a good idea for most lines to be no wider than 60
- characters. The first line can be wider if necessary to fit the information
- that ought to be there.
-
- However, rather than simply filling the entire documentation string, you can
- make it much more readable by choosing line breaks with care. Use blank lines
- between topics if the documentation string is long.
-
- o *Do not* indent subsequent lines of a documentation string so that the text
- is lined up in the source code with the text of the first line. This looks
- nice in the source code, but looks bizarre when users view the documentation.
- Remember that the indentation before the starting double-quote is not part of
- the string!
-
- o A variable's documentation string should start with `*' if the variable is
- one that users would want to set interactively often. If the value is a long
- list, or a function, or if the variable would only be set in init files, then
- don't start the documentation string with `*'. See Defining Variables.
-
- o The documentation string for a variable that is a yes-or-no flag should start
- with words such as ``Non-nil means...'', to make it clear both that the
- variable only has two meaningfully distinct values and which value means
- ``yes''.
-
- o When a function's documentation string mentions the value of an argument of
- the function, use the argument name in capital letters as if it were a name
- for that value. Thus, the documentation string of the function / refers to
- its second argument as `DIVISOR'.
-
- Also use all caps for meta-syntactic variables, such as when you show the
- decomposition of a list or vector into subunits, some of which may be
- variable.
-
- o When a documentation string refers to a Lisp symbol, write it as it would be
- printed (which usually means in lower case), with single-quotes around it.
- For example: ``lambda''. There are two exceptions: write t and nil without
- single-quotes.
-
- o Don't write key sequences directly in documentation strings. Instead, use
- the `\\[...]' construct to stand for them. For example, instead of writing
- `C-f', write `\\[forward-char]'. When the documentation string is printed,
- Emacs will substitute whatever key is currently bound to forward-char. This
- will usually be `C-f', but if the user has moved key bindings, it will be the
- correct key for that user. See Keys in Documentation.
-
- o In documentation strings for a major mode, you will want to refer to the key
- bindings of that mode's local map, rather than global ones. Therefore, use
- the construct `\\<...>' once in the documentation string to specify which key
- map to use. Do this before the first use of `\\[...]'. The text inside the
- `\\<...>' should be the name of the variable containing the local keymap for
- the major mode.
-
-
- ΓòÉΓòÉΓòÉ 39. GNU Emacs Internals ΓòÉΓòÉΓòÉ
-
- This chapter describes how the runnable Emacs executable is dumped with the
- preloaded Lisp libraries in it, how storage is allocated, and some internal
- aspects of GNU Emacs that may be of interest to C programmers.
-
-
- ΓòÉΓòÉΓòÉ 39.1. Building Emacs ΓòÉΓòÉΓòÉ
-
- The first step in building Emacs is to compile the C sources. This produces a
- program called temacs, also called a bare impure Emacs. It contains the Emacs
- Lisp interpreter and I/O routines, but not the editing commands.
-
- Then, to create a working Emacs editor, issue the command `temacs -l loadup'.
- This directs temacs to evaluate the Lisp files specified in the file
- `loadup.el'. These files set up the normal Emacs editing environment,
- resulting in an Emacs which is still impure but no longer bare.
-
- It takes long time to load the standard Lisp files. Luckily, you don't have
- to do this each time you run Emacs; temacs can dump out an executable program
- called xemacs which has these files preloaded. xemacs starts more quickly
- because it does not need to load the files. It is xemacs that is normally
- installed under the name emacs for users to run.
-
- To create xemacs, use the command `temacs -batch -l loadup dump'. The purpose
- of `-batch' here is to prevent temacs from trying to initialize any of its data
- on the terminal; this ensures that the tables of terminal information are empty
- in the dumped Emacs.
-
- When the xemacs executable is started, it will automatically load the user's
- `.emacs' file, or the default initialization file `default.el' if the user has
- none. With the `.emacs' file, you can produce a version of Emacs that suits
- you and is not the same as the version other people use. With `default.el',
- you can customize Emacs for all the users at your site who don't choose to
- customize it for themselves. (For further reflection: why is this different
- from the case of the barber who shaves every man who doesn't shave himself?)
-
- On some systems, dumping does not work. Then, you must start Emacs with the
- `temacs -l loadup' command each time you use it. This takes a long time, but
- since you need to start Emacs once a day at most---and once a week or less
- frequently if you never log out---the extra time is not too severe a problem.
-
- Before xemacs is dumped, the documentation strings for primitive and preloaded
- functions (and variables) need to be found in the file where they are stored.
- This is done by calling Snarf-documentation (see Accessing Documentation).
- These strings are omitted from temacs to save space. See Documentation Basics.
-
- -- Function: dump-emacs to-file from-file
- This function dumps the current state of Emacs into an executable file
- to-file. It takes symbols from from-file (this is normally the executable file
- `temacs').
-
- If you use this function in an Emacs that was already dumped, you must set
- command-line-processed to nil first for good results. See Command Line
- Arguments.
-
- -- Command: emacs-version
- This function returns a string describing the version of Emacs that is
- running. It is useful to include this string in bug reports.
-
- (emacs-version)
- => "GNU Emacs 18.36.1 of Fri Feb 27 1987 on slug (berkeley-unix)"
-
- Called interactively, the function prints the same information in the echo
- area.
-
- -- Variable: emacs-build-time
- The value of this variable is the time at which Emacs was built at the local
- site.
-
- emacs-build-time
- => "Fri Feb 27 14:55:57 1987"
-
- -- Variable: emacs-version
- The value of this variable is the version of Emacs being run. It is a string,
- e.g. "18.36.1".
-
-
- ΓòÉΓòÉΓòÉ 39.2. Pure Storage ΓòÉΓòÉΓòÉ
-
- There are two types of storage in GNU Emacs Lisp for user-created Lisp
- objects: normal storage and pure storage. Normal storage is where all the new
- data which is created during an Emacs session is kept; see the following
- section for information on normal storage. Pure storage is used for certain
- data in the preloaded standard Lisp files: data that should never change during
- actual use of Emacs.
-
- Pure storage is allocated only while temacs is loading the standard preloaded
- Lisp libraries. In the file xemacs, it is marked as read-only (on operating
- systems which permit this), so that the memory space can be shared by all the
- Emacs jobs running on the machine at once. Pure storage is not expandable; a
- fixed amount is allocated when Emacs is compiled, and if that is not sufficient
- for the preloaded libraries, temacs crashes. If that happens, you will have to
- increase the compilation parameter PURESIZE in the file `config.h'. This
- normally won't happen unless you try to preload additional libraries or add
- features to the standard ones.
-
- -- Function: purecopy object
- This function makes a copy of object in pure storage and returns it. It
- copies strings by simply making a new string with the same characters in pure
- storage. It recursively copies the contents of vectors and cons cells. It
- does not make copies of symbols, or any other objects, but just returns them
- unchanged. It signals an error if asked to copy markers.
-
- This function is used only while Emacs is being built and dumped, and is called
- only in the file `emacs/lisp/loaddefs.el'.
-
- -- Variable: pure-bytes-used
- The value of this variable is the number of bytes of pure storage allocated so
- far. Typically, in a dumped Emacs, this number is very close to the total
- amount of pure storage available---if it were not, we would preallocate less.
-
- -- Variable: purify-flag
- This variable determines whether defun should make a copy of the function
- definition in pure storage. If it is non-nil, then the function definition is
- copied into pure storage.
-
- This flag is t while loading all of the basic functions for building Emacs
- initially (allowing those functions to be sharable and non-collectible). It is
- set to nil when Emacs is saved out as xemacs. The flag is set and reset in the
- C sources.
-
- You should not change this flag in a running Emacs.
-
-
- ΓòÉΓòÉΓòÉ 39.3. Garbage Collection ΓòÉΓòÉΓòÉ
-
- When a program creates a list or the user defines a new function (such as by
- loading a library), then that data is placed in normal storage. If normal
- storage runs low, then Emacs asks the operating system to allocate more memory
- in blocks of 1k bytes. Each block is used for one type of Lisp object, so
- symbols, cons cells, markers, etc. are segregated in distinct blocks in memory.
- (Vectors, buffers and certain other editing types, which are fairly large, are
- allocated in individual blocks, one per object, while strings are packed into
- blocks of 8k bytes.)
-
- It is quite common to use some storage for a while, then release it by, for
- example, killing a buffer or deleting the last pointer to an object. Emacs
- provides a garbage collector to reclaim this abandoned storage. (This name is
- traditional, but ``garbage recycler'' might be a more intuitive metaphor for
- this facility.)
-
- The garbage collector operates by scanning all the objects that have been
- allocated and marking those that are still accessible to Lisp programs. To
- begin with, all the symbols, their values and associated function definitions,
- and any data presently on the stack, are accessible. Any objects which can be
- reached indirectly through other accessible objects are also accessible.
-
- When this is finished, all inaccessible objects are garbage. No matter what
- the Lisp program or the user does, it is impossible to refer to them, since
- there is no longer a way to reach them. Their space might as well be reused,
- since no one will notice. That is what the garbage collector arranges to do.
-
- Unused cons cells are chained together onto a free list for future allocation;
- likewise for symbols and markers. The accessible strings are compacted so they
- are contiguous in memory; then the rest of the space formerly occupied by
- strings is made available to the string creation functions. Vectors, buffers,
- windows and other large objects are individually allocated and freed using
- malloc.
-
- Common Lisp note: unlike other Lisps, GNU Emacs Lisp does not call the garbage
- collector when the free list is empty. Instead, it simply requests the
- operating system to allocate more storage, and processing continues until
- gc-cons-threshold bytes have been used.
-
- This means that you can make sure that the garbage collector will not run
- during a certain portion of a Lisp program by calling the garbage collector
- explicitly just before it (provided that portion of the program does not use so
- much space as to force a second garbage collection).
-
- -- Command: garbage-collect
- This command runs a garbage collection, and returns information on the amount
- of space in use. (Garbage collection can also occur spontaneously if you use
- more than gc-cons-threshold bytes of Lisp data since the previous garbage
- collection.)
-
- garbage-collect returns a list containing the following information:
-
- ((used-conses . free-conses)
- (used-syms . free-syms)
- (used-markers . free-markers)
- used-string-chars
- used-vector-slots)
-
- (garbage-collect)
- => ((3435 . 2332) (1688 . 0) (57 . 417) 24510 3839)
-
- Here is a table explaining each element:
-
- used-conses
- The number of cons cells in use.
-
- free-conses
- The number of cons cells for which space has been obtained from the
- operating system, but that are not currently being used.
-
- used-syms
- The number of symbols in use.
-
- free-syms
- The number of symbols for which space has been obtained from the
- operating system, but that are not currently being used.
-
- used-markers
- The number of markers in use.
-
- free-markers
- The number of markers for which space has been obtained from the
- operating system, but that are not currently being used.
-
- used-string-chars
- The total size of all strings, in characters.
-
- used-vector-slots
- The total number of elements of existing vectors.
-
- -- User Option: gc-cons-threshold
- The value of this variable is the number of bytes of storage that must be
- allocated for Lisp objects after one garbage collection in order to request
- another garbage collection. A cons cell counts as eight bytes, a string as one
- byte per character plus a few bytes of overhead, and so on. (Space allocated
- to the contents of buffers does not count.) Note that the new garbage
- collection does not happen immediately when the threshold is exhausted, but
- only the next time the Lisp evaluator is called.
-
- The initial threshold value is 100,000. If you specify a larger value,
- garbage collection will happen less often. This reduces the amount of time
- spent garbage collecting, but increases total memory use. You may want to do
- this when running a program which creates lots of Lisp data.
-
- You can make collections more frequent by specifying a smaller value, down to
- 10,000. A value less than 10,000 will remain in effect only until the
- subsequent garbage collection, at which time garbage-collect will set the
- threshold back to 100,000.
-
-
- ΓòÉΓòÉΓòÉ 39.4. Writing Emacs Primitives ΓòÉΓòÉΓòÉ
-
- Lisp primitives are Lisp functions implemented in C. The details of
- interfacing the C function so that Lisp can call it are handled by a few C
- macros. The only way to really understand how to write new C code is to read
- the source, but we can explain some things here.
-
- An example of a special form is the definition of or, from `eval.c'. (An
- ordinary function would have the same general appearance.)
-
- DEFUN ("or", For, Sor, 0, UNEVALLED, 0,
- "Eval args until one of them yields non-NIL, then return that value.\n\
- The remaining args are not evalled at all.\n\
- If all args return NIL, return NIL.")
- (args)
- Lisp_Object args;
- {
- register Lisp_Object val;
- Lisp_Object args_left;
- struct gcpro gcpro1;
-
- if (NULL(args))
- return Qnil;
-
- args_left = args;
- GCPRO1 (args_left);
-
- do
- {
- val = Feval (Fcar (args_left));
- if (!NULL (val))
- break;
- args_left = Fcdr (args_left);
- }
- while (!NULL(args_left));
-
- UNGCPRO;
- return val;
- }
-
- Let's start with a precise explanation of the arguments to the DEFUN macro:
-
- 1. The first argument is the name of the Lisp symbol to define with this
- function; it is or.
-
- 2. The second argument is the C function name for this function. This is the
- name that is used in C code for calling the function. The name is, by
- convention, `F' prepended to the Lisp name, with all dashes (`-') in the
- Lisp name changed to underscores. Thus, to call this function from C code,
- call For. Remember that the arguments must be of type Lisp_Object; various
- macros and functions for creating values of type Lisp_Object are declared
- in the file `lisp.h'.
-
- 3. The third argument is a C variable name to use for a structure that holds
- the data for the subr object that represents the function in Lisp. This
- structure conveys the Lisp symbol name to the initialization routine that
- will create the symbol and store the subr object as its definition. By
- convention, this name is the C function name with `F' replaced with `S'.
-
- 4. The fourth argument is the minimum number of arguments that the function
- requires. In this case, no arguments are required.
-
- 5. The fifth argument is the maximum number of arguments that the function
- accepts. Alternatively, it can be UNEVALLED, indicating a special form
- that receives unevaluated arguments. A function with the equivalent of an
- &rest argument would have MANY in this position. Both UNEVALLED and MANY
- are macros. This argument must be one of these macros or a number at least
- as large as the fourth argument.
-
- 6. The sixth argument is an interactive specification, a string such as might
- be used as the argument of interactive in a Lisp function. In this case it
- is 0 (a null pointer), indicating that this function cannot be called
- interactively. A value of "" indicates an interactive function not taking
- arguments.
-
- 7. The last argument is the documentation string. It is written just like a
- documentation string for a function defined in Lisp, except you must write
- `\n\' at the end of each line. In particular, the first line should be a
- single sentence.
-
- After the call to the DEFUN macro, you must write the list of argument names
- that every C function must have, followed by ordinary C declarations for them.
- Normally, all the arguments must be declared as Lisp_Object. If the function
- has no upper limit on the number of arguments in Lisp, then in C it receives
- two arguments: the number of Lisp arguments, and the address of a block
- containing their values. These have types int and Lisp_Object *.
-
- Within the function For itself, note the use of the macros GCPRO1 and UNGCPRO.
- GCPRO1 is used to ``protect'' a variable from garbage collection---to inform
- the garbage collector that it must look in that variable and regard its
- contents as an accessible object. This is necessary whenever you call Feval or
- anything that can directly or indirectly call Feval. At such a time, any Lisp
- object that you intend to refer to again must be protected somehow. UNGCPRO
- cancels the protection of the variables that are protected in the current
- function. It is necessary to do this explicitly.
-
- For most data types, it suffices to know that one pointer to the object is
- protected; as long as the object is not recycled, all pointers to it remain
- valid. This is not so for strings, because the garbage collector can move
- them. When a string is moved, any pointers to it that the garbage collector
- does not know about will not be properly relocated. Therefore, all pointers to
- strings must be protected across any point where garbage collection may be
- possible.
-
- The macro GCPRO1 protects just one local variable. If you want to protect
- two, use GCPRO2 instead; repeating GCPRO1 will not work. There are also GCPRO3
- and GCPRO4.
-
- In addition to using these macros, you must declare the local variables such
- as gcpro1 which they implicitly use. If you protect two variables, with
- GCPRO2, you must declare gcpro1 and gcpro2, as it uses them both. Alas, we
- can't explain all the tricky details here.
-
- Defining the C function is not enough; you must also create the Lisp symbol
- for the primitive and store a suitable subr object in its function cell. This
- is done by adding code to an initialization routine. The code looks like this:
-
- defsubr (&subr-structure-name);
-
- subr-structure-name is the name you used as the third argument to DEFUN.
-
- If you are adding a primitive to a file that already has Lisp primitives
- defined in it, find the function (near the end of the file) named
- syms_of_something, and add that function call to it. If the file doesn't have
- this function, or if you create a new file, add to it a syms_of_filename (e.g.,
- syms_of_myfile). Then find the spot in `emacs.c' where all of these functions
- are called, and add a call to syms_of_filename there.
-
- This function syms_of_filename is also the place to define any C variables
- which are to be visible as Lisp variables. DEFVAR_LISP is used to make a C
- variable of type Lisp_Object visible in Lisp. DEFVAR_INT is used to make a C
- variable of type int visible in Lisp with a value that is an integer.
-
- Here is another function, with more complicated arguments. This comes from
- the code for the X Window System, and it demonstrates the use of macros and
- functions to manipulate Lisp objects.
-
- DEFUN ("coordinates-in-window-p", Fcoordinates_in_window_p,
- Scoordinates_in_window_p, 2, 2,
- "xSpecify coordinate pair: \nXExpression which evals to window: ",
- "Return non-nil if POSITIONS (a list, (SCREEN-X SCREEN-Y)) is in WINDOW.\n\
- Returned value is list of positions expressed\n\
- relative to window upper left corner.")
- (coordinate, window)
- register Lisp_Object coordinate, window;
- {
- register Lisp_Object xcoord, ycoord;
-
- if (!CONSP (coordinate)) wrong_type_argument (Qlistp, coordinate);
- CHECK_WINDOW (window, 2);
- xcoord = Fcar (coordinate);
- ycoord = Fcar (Fcdr (coordinate));
- CHECK_NUMBER (xcoord, 0);
- CHECK_NUMBER (ycoord, 1);
- if ((XINT (xcoord) < XINT (XWINDOW (window)->left))
- || (XINT (xcoord) >= (XINT (XWINDOW (window)->left)
- + XINT (XWINDOW (window)->width))))
- {
- return Qnil;
- }
- XFASTINT (xcoord) -= XFASTINT (XWINDOW (window)->left);
- if (XINT (ycoord) == (screen_height - 1))
- return Qnil;
- if ((XINT (ycoord) < XINT (XWINDOW (window)->top))
- || (XINT (ycoord) >= (XINT (XWINDOW (window)->top)
- + XINT (XWINDOW (window)->height)) - 1))
- {
- return Qnil;
- }
- XFASTINT (ycoord) -= XFASTINT (XWINDOW (window)->top);
- return (Fcons (xcoord, Fcons (ycoord, Qnil)));
- }
-
- Note that you cannot directly call functions defined in Lisp as, for example,
- the primitive function Fcons is called above. You must create the appropriate
- Lisp form, protect everything from garbage collection, and Feval the form, as
- was done in For above.
-
- `eval.c' is a very good file to look through for examples; `lisp.h' contains
- the definitions for some important macros and functions.
-
-
- ΓòÉΓòÉΓòÉ 39.5. Object Internals ΓòÉΓòÉΓòÉ
-
- GNU Emacs Lisp manipulates many different types of data. The actual data are
- stored in a heap and the only access that programs have to it is through
- pointers. Pointers are thirty-two bits wide in most implementations.
- Depending on the operating system and type of machine for which you compile
- Emacs, twenty-four to twenty-six bits are used to address the object, and the
- remaining six to eight bits are used for a tag that identifies the object's
- type.
-
- Because all access to data is through tagged pointers, it is always possible
- to determine the type of any object. This allows variables to be untyped, and
- the values assigned to them to be changed without regard to type. Function
- arguments also can be of any type; if you want a function to accept only a
- certain type of argument, you must check the type explicitly using a suitable
- predicate (see Type Predicates).
-
-
- ΓòÉΓòÉΓòÉ 39.5.1. Buffer Internals ΓòÉΓòÉΓòÉ
-
- Buffers contain fields not directly accessible by the Lisp programmer. We
- describe them here, naming them by the names used in the C code. Many are
- accessible indirectly in Lisp programs via Lisp primitives.
-
- name
- The buffer name is a string which names the buffer. It is guaranteed
- to be unique. See Buffer Names.
-
- save_modified
- This field contains the time when the buffer was last saved, as an
- integer. See Buffer Modification.
-
- modtime
- This field contains the modification time of the visited file. It is
- set when the file is written or read. Every time the buffer is
- written to the file, this field is compared to the modification time
- of the file. See Buffer Modification.
-
- auto_save_modified
- This field contains the time when the buffer was last auto-saved.
-
- last_window_start
- This field contains the window-start position in the buffer as of the
- last time the buffer was displayed in a window.
-
- undodata
- This field points to the buffer's undo stack. See Undo.
-
- syntax_table_v
- This field contains the syntax table for the buffer. See Syntax
- Tables.
-
- markers
- This field contains the chain of all markers that point into the
- buffer. At each deletion or motion of the buffer gap, all of these
- markers must be checked and perhaps updated. See Markers.
-
- backed_up
- This field is a flag which tells whether a backup file has been made
- for the visited file of this buffer.
-
- mark
- This field contains the mark for the buffer. The mark is a marker,
- hence it is also included on the list markers. See The Mark.
-
- local_var_alist
- This field contains the association list containing all of the
- variables local in this buffer, and their values. A copy of this
- list is returned by the function buffer-local-variables. See
- Buffer-Local Variables.
-
- mode_line_format
- This field contains a Lisp object which controls how to display the
- mode line for this buffer. See Mode Line Format.
-
-
- ΓòÉΓòÉΓòÉ 39.5.2. Window Internals ΓòÉΓòÉΓòÉ
-
- Windows have the following accessible fields:
-
- height
- The height of the window, measured in lines.
-
- width
- The width of the window, measured in columns.
-
- buffer
- The buffer which the window is displaying. This may change often
- during the life of the window.
-
- start
- The position in the buffer which is the first character to be
- displayed in the window.
-
- pointm
- This is the value of point in the current buffer when this window is
- selected; when it is not selected, it retains its previous value.
-
- left
- This is the left-hand edge of the window, measured in columns. (The
- leftmost column on the screen is column 0.)
-
- top
- This is the top edge of the window, measured in lines. (The top
- line on the screen is line 0.)
-
- next
- This is the window that is the next in the chain of siblings.
-
- prev
- This is the window that is the previous in the chain of siblings.
-
- force_start
- This is a flag which, if non-nil, says that the window has been
- scrolled explicitly by the Lisp program. At the next redisplay, if
- point is off the screen, instead of scrolling the window to show the
- text around point, point will be moved to a location that is on the
- screen.
-
- hscroll
- This is the number of columns that the display in the window is
- scrolled horizontally to the left. Normally, this is 0.
-
- use_time
- This is the last time that the window was selected. This field is
- used by get-lru-window.
-
-
- ΓòÉΓòÉΓòÉ 39.5.3. Process Internals ΓòÉΓòÉΓòÉ
-
- The fields of a process are:
-
- name
- A string, the name of the process.
-
- command
- A list containing the command arguments that were used to start this
- process.
-
- filter
- A function used to accept output from the process instead of a
- buffer, or nil.
-
- sentinel
- A function called whenever the process receives a signal, or nil.
-
- buffer
- The associated buffer of the process.
-
- pid
- An integer, the Unix process id.
-
- childp
- A flag, non-nil if this is really a child process. It is nil for a
- network connection.
-
- flags
- A symbol indicating the state of the process. Possible values
- include run, stop, closed, etc.
-
- reason
- An integer, the Unix signal number that the process received that
- caused the process to terminate or stop. If the process has exited,
- then this is the exit code it specified.
-
- mark
- A marker indicating the position of end of last output from this
- process inserted into the buffer. This is usually the end of the
- buffer.
-
- kill_without_query
- A flag, non-nil meaning this process should not cause confirmation to
- be needed if Emacs is killed.
-
-
- ΓòÉΓòÉΓòÉ 40. Standard Errors ΓòÉΓòÉΓòÉ
-
- Here is the complete list of the error symbols in standard Emacs, grouped by
- concept. The list includes each symbol's message (on the error-message
- property of the symbol), and a cross reference to a description of how the
- error can occur.
-
- Each error symbol has an error-conditions property which is a list of symbols.
- Normally, this list includes the error symbol itself, and the symbol error.
- Occasionally it includes additional symbols, which are intermediate
- classifications, narrower than error but broader than a single error symbol.
- For example, all the errors in accessing files have the condition file-error.
-
- As a special exception, the error symbol quit does not have the condition
- error, because quitting is not considered an error.
-
- See Errors, for an explanation of how errors are generated and handled.
-
- symbol
- string; reference.
-
- error
- "error"; see error in Errors.
-
- quit
- "Quit"; see Quitting.
-
- args-out-of-range
- "Args out of range"; see Sequences Arrays Vectors.
-
- arith-error
- "Arithmetic error"; see / and % in Numbers.
-
- beginning-of-buffer
- "Beginning of buffer"; see Motion.
-
- buffer-read-only
- "Buffer is read-only"; see Read Only Buffers.
-
- end-of-buffer
- "End of buffer"; see Motion.
-
- end-of-file
- "End of file during parsing"; see Input Functions. This is not a
- file-error.
-
- file-error
- See Files. This error, and its subcategories, do not have
- error-strings, because the error message is constructed from the data
- items alone when the error condition file-error is present.
-
- file-locked
- See File Locks. This is a file-error.
-
- file-already-exists
- See Writing to Files. This is a file-error.
-
- file-supersession
- See Buffer Modification. This is a file-error.
-
- invalid-function
- "Invalid function"; see Classifying Lists.
-
- invalid-read-syntax
- "Invalid read syntax"; see Input Functions.
-
- invalid-regexp
- "Invalid regexp"; see Regular Expressions.
-
- no-catch
- "No catch for tag"; see Catch and Throw.
-
- search-failed
- "Search failed"; see Searching and Matching.
-
- setting-constant
- "Attempt to set a constant symbol"; the values of the symbols nil and
- t may not be changed.
-
- void-function
- "Symbol's function definition is void";
- see Function Cells.
-
- void-variable
- "Symbol's value as variable is void";
- see Accessing Variables.
-
- wrong-number-of-arguments
- "Wrong number of arguments"; see Classifying Lists.
-
- wrong-type-argument
- "Wrong type argument"; see Type Predicates.
-
-
- ΓòÉΓòÉΓòÉ 41. Standard Buffer-Local Variables ΓòÉΓòÉΓòÉ
-
- The table below shows all of the variables that are automatically local (when
- set) in each buffer in Emacs Version 18 with the common packages loaded.
-
- abbrev-mode
- See Abbrevs.
-
- auto-fill-hook
- See Auto Filling.
-
- buffer-auto-save-file-name
- See Auto-Saving.
-
- buffer-backed-up
- See Backup Files.
-
- buffer-file-name
- See Buffer File Name.
-
- buffer-read-only
- See Read Only Buffers.
-
- buffer-saved-size
- See Point.
-
- case-fold-search
- See Searching and Case.
-
- ctl-arrow
- See Control Char Display.
-
- default-directory
- See System Environment.
-
- fill-column
- See Auto Filling.
-
- left-margin
- See Indentation.
-
- local-abbrev-table
- See Abbrevs.
-
- major-mode
- See Mode Help.
-
- mark-ring
- See The Mark.
-
- minor-modes
- See Minor Modes.
-
- mode-name
- See Mode Line Variables.
-
- overwrite-mode
- See Insertion.
-
- paragraph-separate
- See Standard Regexps.
-
- paragraph-start
- See Standard Regexps.
-
- require-final-newline
- See Insertion.
-
- selective-display
- See Selective Display.
-
- selective-display-ellipses
- See Selective Display.
-
- tab-width
- See Control Char Display.
-
- truncate-lines
- See Truncation.
-
-
- ΓòÉΓòÉΓòÉ 42. Standard Keymaps ΓòÉΓòÉΓòÉ
-
- The following symbols are used as the names for various keymaps. Some of these
- exist when Emacs is first started, others are only loaded when their respective
- mode is used. This is not an exhaustive list.
-
- Almost all of these maps are used as local maps. Indeed, of the modes that
- presently exist, only Vip mode and Terminal mode ever change the global keymap.
-
- Buffer-menu-mode-map
- A full keymap used by Buffer Menu mode.
-
- c-mode-map
- A sparse keymap used in C mode as a local map.
-
- command-history-map
- A full keymap used by Command History mode.
-
- ctl-x-4-map
- A sparse keymap for subcommands of the prefix C-x 4.
-
- ctl-x-map
- A full keymap for C-x commands.
-
- debugger-mode-map
- A full keymap used by Debugger mode.
-
- dired-mode-map
- A full keymap for dired-mode buffers.
-
- doctor-mode-map
- A sparse keymap used by Doctor mode.
-
- edit-abbrevs-map
- A sparse keymap used in edit-abbrevs.
-
- edit-tab-stops-map
- A sparse keymap used in edit-tab-stops.
-
- electric-buffer-menu-mode-map
- A full keymap used by Electric Buffer Menu mode.
-
- electric-history-map
- A full keymap used by Electric Command History mode.
-
- emacs-lisp-mode-map
- A sparse keymap used in Emacs Lisp mode.
-
- function-keymap
- The keymap for the definitions of keypad and function keys.
- If there are none, then it contains an empty sparse keymap.
-
- fundamental-mode-map
- The local keymap for Fundamental mode.
- It is empty and should not be changed.
-
- Helper-help-map
- A full keymap used by the help utility package.
- It has the same keymap in its value cell and in its function cell.
-
- Info-edit-map
- A sparse keymap used by the e command of Info.
-
- Info-mode-map
- A sparse keymap containing Info commands.
-
- lisp-interaction-mode-map
- A sparse keymap used in Lisp mode.
-
- lisp-mode-map
- A sparse keymap used in Lisp mode.
-
- mode-specific-map
- The keymap for characters following C-c. Note, this is in the global
- map. This map is not actually mode specific: its name was chosen to
- be informative for the user in C-h b (display-bindings), where it
- describes the main use of the C-c prefix key.
-
- mouse-map
- A sparse keymap for mouse commands from the X Window System.
-
- occur-mode-map
- A local keymap used in Occur mode.
-
- text-mode-map
- A sparse keymap used by Text mode.
-
- view-mode-map
- A full keymap used by View mode.
-
-
- ΓòÉΓòÉΓòÉ 43. Standard Hooks ΓòÉΓòÉΓòÉ
-
- The following is a list of hooks available with the distributed 18.52 version
- of GNU Emacs. Some of these hooks are called with run-hooks and can be a list
- of functions. Others are not called with run-hooks and may or may not allow a
- list of functions. For example, the suspend-hook can only reference a single
- function. See Hooks, for more information about using hooks.
-
- *Note:* in version 19, blink-paren-hook and auto-fill-hook are renamed to
- blink-paren-function and auto-fill-function respectively, since they are not
- called by the run-hooks function.
-
- auto-fill-hook
-
- blink-paren-hook
-
- c-mode-hook
-
- command-history-hook
-
- comment-indent-hook
-
- define-hooked-global-abbrev
-
- define-hooked-local-abbrev
-
- dired-mode-hook
-
- disabled-command-hook
-
- edit-picture-hook
-
- electric-buffer-menu-mode-hook
-
- electric-command-history-hook
-
- electric-help-mode-hook
-
- emacs-lisp-mode-hook
-
- find-file-hooks
-
- find-file-not-found-hooks
-
- fortran-comment-hook
-
- fortran-mode-hook
-
- ftp-setup-write-file-hooks
-
- ftp-write-file-hook
-
- indent-mim-hook
-
- LaTeX-mode-hook
-
- ledit-mode-hook
-
- lisp-indent-hook
-
- lisp-interaction-mode-hook
-
- lisp-mode-hook
-
- m2-mode-hook
-
- mail-mode-hook
-
- mail-setup-hook
-
- medit-mode-hook
-
- mh-compose-letter-hook
-
- mh-folder-mode-hook
-
- mh-letter-mode-hook
-
- mim-mode-hook
-
- news-mode-hook
-
- news-reply-mode-hook
-
- news-setup-hook
-
- nroff-mode-hook
-
- outline-mode-hook
-
- plain-TeX-mode-hook
-
- prolog-mode-hook
-
- protect-innocence-hook
-
- rmail-edit-mode-hook
-
- rmail-mode-hook
-
- rmail-summary-mode-hook
-
- scheme-indent-hook
-
- scheme-mode-hook
-
- scribe-mode-hook
-
- shell-mode-hook
-
- shell-set-directory-error-hook
-
- suspend-hook
-
- suspend-resume-hook
-
- temp-buffer-show-hook
-
- term-setup-hook
-
- terminal-mode-hook
-
- terminal-mode-break-hook
-
- TeX-mode-hook
-
- text-mode-hook
-
- vi-mode-hook
-
- view-hook
-
- write-file-hooks
-
- x-process-mouse-hook
-
-
- ΓòÉΓòÉΓòÉ 44. Index ΓòÉΓòÉΓòÉ
-
- Sorry, no fn index
-
- These words prevent "local variables" above from confusing Emacs.